4

刚刚被roboguice弄湿了,我喜欢它!

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

我也一直在使用 mockito,但我不确定我该怎么做?

我知道 android 系统带有各种模拟,但我认为用 mockito 滚动我自己会更好?

无论哪种情况,我都需要在测试时注入它们。

有人对此有任何想法吗?

提前致谢

4

3 回答 3

4

看看https://github.com/roboguice/roboguice/blob/master/astroboy/src/test/java/org/roboguice/astroboy/controller/Astroboy2Test.java使用Modules.override()一些测试覆盖默认模块 -具体配置。

@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()));
}
于 2012-07-24T18:15:54.727 回答
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
}
于 2012-09-14T13:33:18.760 回答
0

@Martin:正如保罗所说,您可以为您的测试位置管理器注入 Robolectric 和 Roboguice。但是我认为用 Mockito 模拟会更好,这篇文章很适合开始。您创建一个模拟对象并将其绑定到您的界面。您还可以找到模拟和注入的示例。

于 2014-03-29T10:17:27.667 回答