Roboguice和模拟:如何让roboguice在测试时注入模拟服务,否则使用REAL呢?

时间:2012-07-24 07:36:09

标签: android dependency-injection mocking mockito roboguice

刚刚用roboguice弄湿我的脚,我喜欢它!

我有很多依赖于DB和LocationManger等的方法因此,当我测试它们时它使用真实对象,我想模拟这些对象,以便在我测试时我不必依赖在任何事情上。

我也一直在使用mockito,但我不确定我该如何解决这个问题?

我知道android系统附带了各种模拟但是我觉得用mockito滚动自己会更好吗?

在任何一种情况下,我都需要在测试时注入它们。

有人对此有任何想法吗?

提前致谢

3 个答案:

答案 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对象并将其绑定到您的界面。你也可以找到模拟和注入的例子。