在我的测试中我需要Robolectric和Mockito,每个人都提出自己的TestRunner

J. *_* K. 18 android unit-testing mockito robolectric

在我的测试中我需要Robolectric和Mockito,每个人都提出自己的TestRunner,我该怎么办?

我有这个代码:

@RunWith(MockitoJUnitRunner.class)
@EBean
public class LoginPresenterTest {

    @Bean
    LoginPresenter loginPresenter;

    @Mock
    private LoginView loginView;

    @AfterInject
    void initLoginPresenter() {
        loginPresenter.setLoginView(loginView);
    }

    @Test
    public void whenUserNameIsEmptyShowErrorOnLoginClicked() throws Exception {
        when(loginView.getUserName()).thenReturn("");
        when(loginView.getPassword()).thenReturn("asdasd");
        loginPresenter.onLoginClicked();
        verify(loginView).setEmailFieldErrorMessage();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是AndroidAnnotations没有注入依赖项,我在尝试使用时获得了NPELoginPresenter

有人告诉我使用LoginPresenter_构造函数,以便我可以通过这种方式强制注入依赖项:

LoginPresenter loginPresenter = LoginPresenter_.getInstance_(context);
Run Code Online (Sandbox Code Playgroud)

为了获得对上下文的访问,我不得不从单元测试切换到Android Instrumentation测试,getInstrumentation().getTargetContext() 但我想要单元测试,而不是仪器测试.

所以另一个人告诉我使用Robolectric它 - 它应该能够为我提供应用程序上下文.

但是,当我查看入门页面时Robolectric,它说

@RunWith(RobolectricGradleTestRunner.class)
Run Code Online (Sandbox Code Playgroud)

这将与我目前@RunWith对Mockito的注释冲突,所以我该怎么办?

Jef*_*ica 31

使用Robolectric转轮.Robolectric使用自己的类加载器,有利于它替代Android API,所以它确实需要自己处理类加载.没有其他方法可以使用Robolecric.

有几种方法可以初始化Mockito(请参阅此SO答案),这与使用跑步者完全相同,但对您的案例最有意义的两种方法是: