刚刚用roboguice弄湿我的脚,我喜欢它!
我有很多依赖于DB和LocationManger等的方法因此,当我测试它们时它使用真实对象,我想模拟这些对象,以便在我测试时我不必依赖在任何事情上。
我也一直在使用mockito,但我不确定我该如何解决这个问题?
我知道android系统附带了各种模拟但是我觉得用mockito滚动自己会更好吗?
在任何一种情况下,我都需要在测试时注入它们。
有人对此有任何想法吗?
提前致谢
答案 0 :(得分:4)
查看使用Modules.override()
的{{3}},使用某些特定于测试的配置覆盖默认模块。
@Before
public void setup() {
// Override the default RoboGuice module
RoboGuice.setBaseApplicationInjector(Robolectric.application, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(Robolectric.application)).with(new MyTestModule()));
// For roboguice 4.0 and robolectric 3.1.2
RoboGuice.getOrCreateBaseApplicationInjector(RuntimeEnvironment.application, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(RuntimeEnvironment.application)).with(new MyTestModule()));
}
答案 1 :(得分:3)
只是为了扩展这个,因为它在我寻找它时是最受欢迎的......
一旦设置了测试类(或测试运行器)以覆盖默认的RoboGuice模块,然后将覆盖的RoboGuice模块设置为(在此实例中)
public class TestModule extends AbstractModule {
@Override
protected void configure() {
bind(LocationManager.class).toInstance((LocationManager) Robolectric.application.getSystemService(Context.LOCATION_SERVICE));
}
}
然后RoboGuice将在您的测试中注入与您的应用程序中相同的位置管理器。您可以实例化它的阴影并设置预期位置,提供者状态等。
@Test
public void mapLoadsCenteredOnPhoneLocationWhenNoTargetIntent() {
Location l = new Location("test");
l.setLatitude(Double.parseDouble("52.222"));
l.setLongitude(Double.parseDouble("-2.222"));
shadowLocationManager.setLastKnownLocation(GPS_PROVIDER, l);
shadowLocationManager.setProviderEnabled(GPS_PROVIDER, true);
shadowLocationManager.setProviderEnabled(NETWORK_PROVIDER, false);
//snip
}
答案 2 :(得分:0)
@Martin:保罗说你可以向Robolectric和Roboguice注入你的测试位置经理。但是我认为如果用Mockito嘲笑它会更好,这post对于开始是有好处的。您创建一个Mocked对象并将其绑定到您的界面。你也可以找到模拟和注入的例子。