I think Mockito-Flex is confusing Swiz or vice versa.
If I assign the mock BEFORE configuring swiz, I get a null object
reference for the dispatcher.
If I assign the mock AFTER configuring swiz, the test runs but calls
the real userService versus the mock one.
Runs the test but does not assign the mockUserService (makes real call
to the server):
======================================================================================
public class UserControllerTestSwiz extends SwizTestCase
{
[Rule]
public var mockitoRule:IMethodRule = new MockitoRule();
public function UserControllerTestSwiz()
{
super();
}
private var _userController:UserController;
//private var mockUser:User;
private var _user:User;
[Mock(type="service.UserService")]
private var mockUserService:UserService;
[Before]
public function setUp():void
{
//mockUserService = mock(UserService);
//_userController.userService = mockUserService;
_userController = configSwiz("userController");
mockUserService = mock(UserService);
_userController.userService = mockUserService;
}
[After]
public function tearDown():void
{
_userController = null;
}
[Test(async)]
public function testCreateUser() : void
{
_user = UserFactory.createUser();
//Async.handleEvent( this, swiz.dispatcher,
UserEvent.CREATE_USER_ERROR, errorEvent );
//
Async.proceedOnEvent(this,swiz.dispatcher,UserEvent.CREATE_USER_REQUESTED,
5000,timeoutHandler);
//
Async.proceedOnEvent(this,swiz.dispatcher,UserEvent.CREATE_USER_COMPLETE,
5000,timeoutHandler);
//Async.handleEvent( this, swiz.dispatcher,
UserEvent.CREATE_USER_COMPLETE, checkEvent, 1000, _user,
timeoutHandlerCreateUserComplete );
var eventy : UserEvent = new
UserEvent( UserEvent.CREATE_USER_REQUESTED );
eventy.user = _user;
swiz.dispatcher.dispatchEvent( eventy );
}
private function checkEvent( event : UserEvent, passThroughData :
Object ) : void
{
// put assert here
}
/*
protected function verifyUpdate(event:Event,
passThroughData:Object):void {
var updatedEmployee:Employee = passThroughData as Employee;
Assert.assertEquals(pm.tempEmployee.firstName,
updatedEmployee.firstName);
}
*/
private function errorEvent( event : UserEvent, passThroughData :
Object ) : void
{
// put assert here
}
private function timeoutHandlerCreateUserComplete(passThroughData :
Object):void
{
Assert.fail("Timeout waiting for CreateUserComplete");
}
protected function
dispatchingEventNeverOccurred( passThroughData:Object ):void
{
Assert.fail( 'event is not dispatched');
}
}
Fails with null object reference error when trying to dispatch event
in the test case:
======================================================================================
public class UserControllerTestSwiz extends SwizTestCase
{
[Rule]
public var mockitoRule:IMethodRule = new MockitoRule();
public function UserControllerTestSwiz()
{
super();
}
private var _userController:UserController;
//private var mockUser:User;
private var _user:User;
[Mock(type="service.UserService")]
private var mockUserService:UserService;
[Before]
public function setUp():void
{
mockUserService = mock(UserService);
_userController = configSwiz("userController");
//mockUserService = mock(UserService);
_userController.userService = mockUserService;
}
[After]
public function tearDown():void
{
_userController = null;
}
[Test(async)]
public function testCreateUser() : void
{
_user = UserFactory.createUser();
//Async.handleEvent( this, swiz.dispatcher,
UserEvent.CREATE_USER_ERROR, errorEvent );
//
Async.proceedOnEvent(this,swiz.dispatcher,UserEvent.CREATE_USER_REQUESTED,
5000,timeoutHandler);
//
Async.proceedOnEvent(this,swiz.dispatcher,UserEvent.CREATE_USER_COMPLETE,
5000,timeoutHandler);
//Async.handleEvent( this, swiz.dispatcher,
UserEvent.CREATE_USER_COMPLETE, checkEvent, 1000, _user,
timeoutHandlerCreateUserComplete );
var eventy : UserEvent = new
UserEvent( UserEvent.CREATE_USER_REQUESTED );
eventy.user = _user;
swiz.dispatcher.dispatchEvent( eventy );
}
private function checkEvent( event : UserEvent, passThroughData :
Object ) : void
{
// put assert here
}
/*
protected function verifyUpdate(event:Event,
passThroughData:Object):void {
var updatedEmployee:Employee = passThroughData as Employee;
Assert.assertEquals(pm.tempEmployee.firstName,
updatedEmployee.firstName);
}
*/
private function errorEvent( event : UserEvent, passThroughData :
Object ) : void
{
// put assert here
}
private function timeoutHandlerCreateUserComplete(passThroughData :
Object):void
{
Assert.fail("Timeout waiting for CreateUserComplete");
}
protected function
dispatchingEventNeverOccurred( passThroughData:Object ):void
{
Assert.fail( 'event is not dispatched');
}
}
Stack trace for the null object reference:
======================================================================================
TypeError: Error #1009: Cannot access a property or method of a null
object reference.
**[ at controller.test::UserControllerTestSwiz/
testCreateUser(UserControllerTestSwiz.as:78) ]
at Function/
http://adobe.com/AS3/2006/builtin::apply
at flex.lang.reflect::Method/apply(Method.as:210)
at org.flexunit.runners.model::FrameworkMethod/
invokeExplosively(FrameworkMethod.as:201)
at org.flexunit.internals.runners.statements::InvokeMethod/
evaluate(InvokeMethod.as:72)
at org.flexunit.internals.runners.statements::ExpectAsync/
evaluate(ExpectAsync.as:595)
at org.flexunit.internals.runners.statements::RunBeforesInline/
handleSequenceExecuteComplete(RunBeforesInline.as:41)
at org.flexunit.token::AsyncTestToken/sendResult(AsyncTestToken.as:
119)
at org.flexunit.internals.runners.statements::AsyncStatementBase/
sendComplete(AsyncStatementBase.as:76)
at org.flexunit.internals.runners.statements::StatementSequencer/
sendComplete(StatementSequencer.as:172)
at org.flexunit.internals.runners.statements::StatementSequencer/
handleChildExecuteComplete(StatementSequencer.as:145)
at org.flexunit.token::AsyncTestToken/sendResult(AsyncTestToken.as:
119)
at org.flexunit.internals.runners.statements::InvokeMethod/
evaluate(InvokeMethod.as:75)
at org.flexunit.internals.runners.statements::SequencerWithDecoration/
executeStep(SequencerWithDecoration.as:100)
at org.flexunit.internals.runners.statements::StatementSequencer/
handleChildExecuteComplete(StatementSequencer.as:141)
at org.flexunit.token::AsyncTestToken/sendResult(AsyncTestToken.as:
119)
at org.flexunit.internals.runners.statements::InvokeMethod/
evaluate(InvokeMethod.as:73)
at org.flexunit.internals.runners.statements::SequencerWithDecoration/
executeStep(SequencerWithDecoration.as:100)
at org.flexunit.internals.runners.statements::StatementSequencer/
handleChildExecuteComplete(StatementSequencer.as:141)
at org.flexunit.internals.runners.statements::StatementSequencer/
evaluate(StatementSequencer.as:109)
at org.flexunit.internals.runners.statements::RunBeforesInline/
evaluate(RunBeforesInline.as:36)
at org.flexunit.internals.runners.statements::RunAftersInline/
evaluate(RunAftersInline.as:39)
at org.flexunit.internals.runners.statements::StatementSequencer/
executeStep(StatementSequencer.as:98)
at org.flexunit.internals.runners.statements::StatementSequencer/
handleChildExecuteComplete(StatementSequencer.as:141)
at org.flexunit.token::AsyncTestToken/sendResult(AsyncTestToken.as:
119)
at org.mockito.integrations.flexunit4::AssignMocks/
assignMocks(AssignMocks.as:45)
at org.mockito.integrations.flexunit4::AssignMocks/
evaluate(AssignMocks.as:25)
at org.flexunit.internals.runners.statements::StatementSequencer/
executeStep(StatementSequencer.as:98)
at org.flexunit.internals.runners.statements::StatementSequencer/
handleChildExecuteComplete(StatementSequencer.as:141)
at org.flexunit.token::AsyncTestToken/sendResult(AsyncTestToken.as:
119)
at Function/org.mockito.integrations.flexunit4:PrepareMocks/
private:prepareMocks/
org.mockito.integrations.flexunit4:repositoryPreparedHandler(PrepareMocks.as:
44)
at Function/<anonymous>(AsmockMockery.as:79)
at flash.events::EventDispatcher/dispatchEventFunction
at flash.events::EventDispatcher/dispatchEvent
at CompletedEventDispatcher/addEventListener(ProxyRepositoryImpl.as:
224)
at org.mockito.impl::AsmockMockery/prepareClasses(AsmockMockery.as:86)
at org.mockito::Mockito/prepareClasses(Mockito.as:236)
at org.mockito.integrations.flexunit4::PrepareMocks/
prepareMocks(PrepareMocks.as:40)
at org.mockito.integrations.flexunit4::PrepareMocks/
evaluate(PrepareMocks.as:23)
at org.flexunit.internals.runners.statements::StatementSequencer/
executeStep(StatementSequencer.as:98)
at org.flexunit.internals.runners.statements::StatementSequencer/
handleChildExecuteComplete(StatementSequencer.as:141)
at org.flexunit.internals.runners.statements::StatementSequencer/
evaluate(StatementSequencer.as:109)
at org.flexunit.internals.runners.statements::MethodRuleBase/
proceedToNextStatement(MethodRuleBase.as:21)
at org.mockito.integrations.flexunit4::MockitoRule/
evaluate(MockitoRule.as:50)
at org.flexunit.internals.runners.statements::StackAndFrameManagement/
handleTimerComplete(StackAndFrameManagement.as:135)
at flash.events::EventDispatcher/dispatchEventFunction
at flash.events::EventDispatcher/dispatchEvent
at flash.utils::Timer/tick
Superclass SwizTestCase:
======================================================================================
public class SwizTestCase extends AutowiredTestCase
{
public var swizBeans:Beans;
[Dispatcher]
public var dispatcher:IEventDispatcher;
public function SwizTestCase() {
super();
}
/**
* Returns a bean of the type found in the BeanProvider with the
* supplied ID value and initializes everything.
*
* @param beanId id of bean in BeanProvider
* @return bean found from supplied id
*/
public function configSwiz(beanId:String):* {
// initialize Swiz
swizConfig = new SwizConfig();
swizConfig.eventPackages = "event.*";
swizBeans = new Beans(); //<= Beans is the name
of our BeanProvider
beanProviders = [swizBeans]; //<= This initializes
everything,or you're getting null in the dispatcher (it's
notinitialized)
constructSwizContext(); //<= initialize
return lookupBean(beanId);
}
public function getSwizBean(id:String):* {
return lookupBean(id);
}
public function lookupBean(beanId:String):* {
var bean:*;
// lookup the bean
try {
bean = swizBeans[beanId];
}
catch (e:Error) {
throw new Error("Unable to locate bean with id: " + beanId);
}
return bean; //<= gets
you the singleton instance of the bean specified by the id