我需要在我的测试中同时使用Robolectric和Mockito,每个工具都提供了自己的TestRunner。

24

我需要在我的测试中同时使用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仪器化测试,并使用getInstrumentation().getTargetContext()。 但是我想要单元测试,而不是仪器化测试。 所以另一个人告诉我要使用Robolectric - 它应该能够为我提供应用程序上下文。 然而,当我查看Robolectric的入门页面时,它说:
@RunWith(RobolectricGradleTestRunner.class)

这将与我当前为 Mockito 设置的 @RunWith 注解相冲突,那么我该怎么办?

1个回答

41

使用Robolectric runner。 Robolectric使用自己的类加载器,优先考虑其对Android API的替代品,因此确实需要自己处理类加载。没有其他方法可以使用Robolecric。

有几种初始化Mockito的方式(参见这个SO答案),与使用runner严格等效,但对于你的情况最有意义的两种方式是:

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

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

  • @Before public void setUpMockito() {
      MockitoAnnotations.initMocks(this);
    }
    
    @After public void tearDownMockito() {
      Mockito.validateMockitoUsage();
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接