Мне нужны как Robolectric, так и Mockito в моем тесте, каждый из них предлагает свой собственный TestRunner

Мне нужны как 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 не вставляет зависимостей, и я получаю NPE при попытке использовать LoginPresenter

Кто-то сказал мне использовать конструктор LoginPresenter_ , чтобы я мог принудительно вводить зависимость таким образом:

 LoginPresenter loginPresenter = LoginPresenter_.getInstance_(context); 

Чтобы получить доступ к контексту, мне пришлось переключиться с Unit Tests на Android Instrumentation Tests и получить getInstrumentation().getTargetContext() но я хочу тесты Unit, а не Instrumentation.

Так что другой человек сказал мне использовать Robolectric для этого – он должен быть в состоянии предоставить мне контекст приложения.

Однако, когда я смотрел Robolectric страницу Robolectric , она говорит:

 @RunWith(RobolectricGradleTestRunner.class) 

@RunWith собирается столкнуться с моей текущей аннотацией @RunWith для Mockito, так что мне делать?

Используйте бегун Robolectric. Robolectric использует свой собственный загрузчик классов, который поддерживает его замены для Android API, поэтому ему действительно нужно обрабатывать загрузку классов самостоятельно. Другого способа использовать Robolecric нет.

Существует несколько способов инициализации Mockito (см. Этот ответ SO ), которые строго эквивалентны использованию бегуна, но два, которые имеют наибольший смысл для вашего случая:

  • Используя MockitoRule , потому что вы уже на JUnit4:

     @Rule public MockitoRule rule = MockitoJUnit.rule(); 
  • Создание ручных @Before и @After :

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