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

时间:2016-03-18 10:46:53

标签: 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();
    }
}

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

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

LoginPresenter loginPresenter = LoginPresenter_.getInstance_(context);

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

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

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

@RunWith(RobolectricGradleTestRunner.class)

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

1 个答案:

答案 0 :(得分:30)

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

有几种方法可以初始化Mockito(参见this SO answer),这与使用跑步者完全相同,但对你的情况最有意义的两种方法是:

  • 使用MockitoRule,因为您已经在JUnit4上了:

    Adapter
  • 创建手动@Rule public MockitoRule rule = MockitoJUnit.rule(); @Before方法:

    @After