2015-04-12 3 views
14

я стараюсь, чтобы запустить этот тест:фиктивный экземпляр является недействительным после @Mock аннотации

@Mock IRoutingObjHttpClient routingClientMock; 
    @Mock IRoutingResponseRepository routingResponseRepositoryMock; 


    @Test 
    public void testSendRoutingRequest() throws Exception { 
     CompleteRoutingResponse completeRoutingResponse = new CompleteRoutingResponse(); 
     completeRoutingResponse.regression_latencyMillis = 500L; 

     Mockito.when(routingClientMock.sendRoutingRequest(any(RoutingRequest.class))).thenReturn(completeRoutingResponse); 

     RoutingObjHttpClientWithReRun routingObjHttpClientWithReRun = new RoutingObjHttpClientWithReRun 
       (routingClientMock, routingResponseRepositoryMock); 

... 
    } 

, но я получаю NullPointerException для:

Mockito.when(routingClientMock.

Что мне не хватает?

+1

Вы называете 'MockitoAnnotations.initMocks (this)'? (Возможно, это должно быть в методе @Before) Или у вас есть еще один @Rule, который вы ожидаете инициализировать свои макеты? (Это не автоматическое) –

+0

Вам нужно создать экземпляр 'routingClientMock', например. 'routingClientMock = Mockito.mock (RoutingObjHtttpClient.class);' –

+0

Вы также можете использовать '@RunWith (MockitoJUnitRunner.class) 'в вашем классе –

ответ

21

Если вы хотите использовать @Mock аннотацию следует использовать MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class) 
public class MockitoTest { 

    @Mock 
    private IRoutingObjHttpClient routingClientMock; 

    @Test 
    public void testSendRoutingRequest() throws Exception { 
     // ... 
    } 

} 

См. Также this tutorial.

+0

Он не работает для меня, всегда дает эту ошибку «dexcache == null (и не было найдено по умолчанию, рассмотрим установку системного свойства dexmaker.dexcache)» – pyus13

+0

@ pyus13 Это должен быть новый вопрос с большим количеством кода. –

+0

Оцените ответ, я думаю, проблема в том, что я использовал его в JUnit Test, и в то время как некоторый код объединяет кого-то из команды, ошибочно добавленной зависимостями testImplementation от dex. После удаления этой строки из build.gradle все было начато. Спасибо, что это спасет чье-то время. – pyus13

0
  1. Вы должны использовать @RunWith(SpringJUnit4ClassRunner.class) в своем классе
  2. Вы должны вызвать MockitoAnnotations.initMocks(this); в методе @Before
+0

, почему' @RunWith (SpringJUnit4ClassRunner.class) ', а не' MockitoJUnitRunner.class'? –

19

У вас есть три варианта активации аннотации @Mock. ИМХО, использующий MockitoRule, является лучшим, потому что он позволяет вам выбрать другой бегун, например, например. Parameterized.

Используйте MockitoRule

public class MockitoTest { 

    @Mock 
    private IRoutingObjHttpClient routingClientMock; 

    @Rule 
    public MockitoRule rule = MockitoJUnit.rule(); 

    @Test 
    public void testSendRoutingRequest() throws Exception { 
    // ... 
    } 
} 

Используйте MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class) 
public class MockitoTest { 

    @Mock 
    private IRoutingObjHttpClient routingClientMock; 

    @Test 
    public void testSendRoutingRequest() throws Exception { 
    // ... 
    } 
} 

Вызов MockitoAnnotations.initMocks(this) явно. Это можно сделать в методе qn @Before, в вашем собственном бегуне или в собственном правиле.

public class MockitoTest { 

    @Mock 
    private IRoutingObjHttpClient routingClientMock; 

    @Before 
    public void createMocks() { 
    MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testSendRoutingRequest() throws Exception { 
    // ... 
    } 
} 
+1

Это самый полный ответ! –

-1

Если вы также используете PowerMock затем

@RunWith(MockitoJUnitRunner.class) 

может быть заменен

@RunWith(PowerMockRunner.class) 

Это активирует вашу @Mocks и включить функцию PowerMock.

0

Постарайтесь проверить, является ли метод, который вы вызываете, окончательным методом или нет.

Mockito не может высмеять окончательный метод. https://github.com/mockito/mockito/wiki/FAQ

0

Это также может быть проблема с импортом, поэтому убедитесь, что у вас есть соответствующий импортный пакет.

Например, пакет «org.easymock» также имеет аннотацию под названием @Mock, которая, конечно же, не будет работать с конкретной установкой Mockito.

Смежные вопросы