上一篇我们简单的介绍了一下RoboGuice的使用(【九】注入框架RoboGuice使用:(Your
First Injected Service and BroadcastReceiver)),今天我们来看下測试用例(TestCase)的注入
RoboGuice使得我们更加easy实现可測试的Android应用程序,本文章就来具体讲解下:当我们測试的时候,怎样编写測试用例,已经从RoboGuice中获益。本文章使用Android Robolectric,适合大部分用Android标准測试的情况。
我们用Mockito来模拟关系依赖,EasyMock使用同一种方式。
(一):来进行測试RoboActivity的子类,如果如今有一个使用Service 的Activity
public class MyRoboActivity extends RoboActivity {
@Inject MyService service; public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
service.compute();
}
} public class MyService {
public void compute() {
...
}
}
然后须要编写測试用例来检查Activity是否正确调用了servce。
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
private Service serviceMock = mock(Service.class); @Before
public void setup() {
// Override the default RoboGuice module
RoboGuice.overrideApplicationInjector(Robolectric.application, new MyTestModule());
} @After
public void teardown() {
// Don't forget to tear down our custom injector to avoid polluting other test classes
RoboGuice.Util.reset();
} @Test
public void createTriggersCompute() throws InterruptedException {
Robolectric.buildActivity(MyActivity.class).create().start();
verify(serviceMock).compute();
} public class MyTestModule extends AbstractModule {
@Override
protected void configure() {
bind(Service.class).toInstance(serviceMock);
}
}
}
该測试下面几项:
①:在设置的时候,会覆盖RoboGuice默认绑定而且使用一个自己定义的測试模块
②:这个測试模块绑定Service到mock上面
③:该測试创建一个MyActivity的实例,该会通过注入(injection)获取mock
④:验证mock应该被调用.
(二):測试一个服务,如果有个service例如以下:
public class MyService {
@Inject Vibrator vibrator;
@Inject Context context; public void compute() {
context...
vibrator.vibrate(...);
}
}
然后我们能够编写一个简单的測试用来检測service是否正确调用了vibrator
@RunWith(RobolectricTestRunner.class)
public class ServiceTest {
protected Vibrator vibratorMock = mock(Vibrator.class);
protected Service service; @Before
public void setup() {
// Override the default RoboGuice module
RoboGuice.overrideApplicationInjector(Robolectric.application, new MyTestModule());
service = RoboGuice.getInjector(Robolectric.application).getInstance(Service.class);
} @After
public void teardown() {
// Don't forget to tear down our custom injector to avoid polluting other test classes
RoboGuice.Util.reset();
} @Test
public void computeShouldCausePhoneToVibrate() {
service.compute();
verify(vibratorMock).vibrate(...);
} public class MyTestModule extends AbstractModule {
@Override
protected void configure() {
bind(Vibrator.class).toInstance(vibratorMock);
}
}
}
该測试下面几项:
①:在设置的时候,会覆盖RoboGuice默认绑定而且使用一个自己定义的測试模块
②:该測试模块绑定Vibrator到mock中
③:该測试模块会创建service的实例,通过注入会获取上下文以及mock
④:验证mock已经被调用了