【问题标题】:Determine for which test setup() is being called?确定正在调用哪个测试 setup()?
【发布时间】:2015-11-22 12:06:35
【问题描述】:

我正在使用 Mockito 为我的 Android 应用程序编写单元测试。 我正在使用 dagger 2 在模拟客户端和真实客户端之间切换:

@Module
public class ApiModule {

    private boolean mMockMode;

    @Provides
    @Singleton
    Client provideClient() {

        if (mMockMode) {
                return Mockito.mock(Client.class);
        }

        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.networkInterceptors().add(new StethoInterceptor());

        return new OkClient(okHttpClient);

    }

}

客户端像这样被注入到测试中:

public class MainActivityTest extends ActivityInstrumentationTestCase2<BaseActivity> {  

    @Inject
    Client client;

    public MainActivityTest() {
        super(MainActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        App app = (App) getInstrumentation().getTargetContext().getApplicationContext();
        app.setMockMode(true);
        app.component().inject(this);
    }

    @Test
    public void testWithActualCall(){
        //code...
    }

    @Test
    public void testWithMockCall(){
        //code...
    }

    @Override
    protected void tearDown() throws Exception {
        App.getInstance().setMockMode(false);
    }
}

从代码中可以看出,我希望使用模拟 api 进行一些测试,而我希望使用真正的 api 进行其他测试。为此,我需要知道正在调用哪个测试 setUp(),以便我可以相应地更改 setMockMode(boolean) 的参数。

有什么方法可以查出setUp()是哪个测试?

【问题讨论】:

  • 他们在 ApiModule 类中混合测试和生产代码的方式是一种代码味道,imo。查看 dagger 文档中的“模块覆盖”以获得更好的使用模拟注入的解决方案:square.github.io/dagger
  • @Bewusstsein 您链接到的模块覆盖是原始 Dagger 的一部分,而不是 Google 的 Dagger 2 分支。也就是说,你对气味的看法是对的,你可以轻松地制作一个扩展 ApiModule 并覆盖 provideClient 方法的模块。

标签: android unit-testing mockito dagger-2


【解决方案1】:

将测试分成 2 个类,一个包含所有使用模拟 API 的测试,另一个包含真实 API。

使用你所拥有的作为基类,将mockMode 的值移动到一个方法中,然后在另一个类中覆盖该方法:

public class MainActivityMockApiTest extends ActivityInstrumentationTestCase2<BaseActivity> {  

    ...

    @Override
    protected void setUp() throws Exception {
        ...
        app.setMockMode(isMockMode());
        ...
    }

    protected boolean isMockMode() {
        // overridden in MainActivityRealApiTest
        return true;
    }

    ...
}

【讨论】:

    猜你喜欢
    • 2022-10-12
    • 2019-04-14
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多