Mockito не высмеивает возвращаемое значение метода переменной-члена - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть следующий класс, который содержит переменную-член, но Mockito не может насмехаться над методами переменной-члена.Ниже моя тестируемая система:

public class MessageConsumer {

    private ConsumerResponse consumerResponse;
    private NotificationConsumer notificationConsumer;

    @Scheduled(cron = "${com.example.value}")
    public void fetch() {
        consumerResponse = notificationConsumer.fetchWithReturnConsumerResponse(); //no exception thrown on this line at all -- but could this be the cause of the problem in the test?
        System.out.println("consumerResponse's responseCode: " + consumerResponse.getResponseCode()); // NullPointerException thrown here
    }

    public ConsumerResponse setConsumerResponse(ConsumerResponse consumerResponse) {
        this.consumerResponse = consumerResponse;
    }

    public ConsumerResponse getConsumerResponse() {
        return consumerResponse;
    }
}

А вот соответствующий тест JUnit для класса:

@SpringBootTest
@RunWith(MockitoJUnitRunner.class)
public class MessageConsumerTest {

    @Mock
    private ConsumerResponse consumerResponse;

    @InjectMocks
    private MessageConsumer messageConsumer;

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

    //Failing unit test
    @Test
    public void getResponseCodeShouldReturn200() {
        Mockito.when(consumerResponse.getResponseCode()).thenReturn("200");
        messageConsumer.fetch()
    }

}

Как видите, я высмеял ConsumerResponse consumerResponseпеременная, которая возвращает "200", когда вызывается метод consumerResponse.getResponseCode().Вместо этого я получаю NullPointerException.

Я почти уверен, что правильно смоделировал переменную-член и правильно ее инициализировал (initMocks).Я провел дни, пытаясь понять это.Куда я иду не так?

1 Ответ

0 голосов
/ 25 ноября 2018

Поскольку NotificationConsumer также является внешней зависимостью для этого класса, вы должны также смоделировать этот класс, так как в противном случае consumerResponse = notificationConsumer.fetchWithReturnConsumerResponse(); приведет к null в вашем тесте, поскольку вы не высмеивали NotificationConsumer.Кроме того, я бы предложил не использовать @SpringBootTest в этом тесте unit , так как эта аннотация будет загружать весь контекст Spring.Вам поможет следующий фрагмент:

@RunWith(MockitoJUnitRunner.class)
public class MessageConsumerTest {

    @Mock
    private ConsumerResponse consumerResponse;

    @Mock
    private NotificationConsumer notificationConsumer;

    @InjectMocks
    private MessageConsumer messageConsumer;

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

    @Test
    public void getResponseCodeShouldReturn200() {
        Mockito.when(notificationConsumer.fetchWithReturnConsumerResponse()).thenReturn(consumerResponse);
        Mockito.when(consumerResponse.getResponseCode()).thenReturn("200");
        messageConsumer.fetch();
    }

}
...