У меня есть метод void, а именно invokeEllaAsync, который я хотел бы протестировать в экосистеме Spring и который представлен ниже. Метод также вызывает другой метод void изнутри как вложенный вызов.
Насмешливая информация представлена ниже,
@InjectMocks
private EllaService ellaService;
private IrisBo validIrisBo;
@Mock
private EllaRequestDto ellaRequestDtoMock;
@Mock
private EntityServiceConnectable<EllaResponseDto> connectorMock;
@Mock
private EllaResponseDto ellaResponseMock;
@Async
public void invokeEllaAsync( final IrisBo irisBo ) throws EllaGatewayUnsuccessfulResponseException {
try {
callEllaService( irisBo );
}
/**
* Asynchronously call Ella. Determine if traffic is applicable for Ella and if yes forward to Ella.
*
* @param irisEo
* @return List<ResultBo>
* @throws EllaGatewayUnsuccessfulResponseException
*/
catch( EllaGatewayUnsuccessfulResponseException ex ) {
throw new EllaGatewayUnsuccessfulResponseException( ex.getMessage(), ex.getCause() );
}
}
private void callEllaService( final IrisBo irisBo ) throws EllaGatewayUnsuccessfulResponseException {
HttpHeaders elladHeaders = createRequestHeaders( irisBo );
ServiceResponse<EllaResponseDto> response = connector.call( EllaDtoConverter.convertToRequest( irisBo ), elladHeaders );
if ( !response.isSuccess() ) {
throw new EllaGatewayUnsuccessfulResponseException( response.getErrorMessage(), response.getException().getCause() );
}
}
Я пытаюсь протестировать метод invokeEllaAsync следующим образом:
@Test
public void testInvokeEllaShowsSuccess() {
ServiceResponse<EllaResponseDto> validServiceResponseMock = mock( ServiceResponse.class );
when( connectorMock.call( any(), (HttpHeaders) any() ) ).thenReturn( validServiceResponseMock );
when( validServiceResponseMock.isSuccess() ).thenReturn( true );
ellaService.invokeEllaAsync( validIrisBo );
verify( ellaService, times( 1 ) ).invokeEllaAsync( validIrisBo );
}
Я получаю ошибку, указанную ниже,
org.mockito.exceptions.misusing.NotAMockException:
Argument passed to verify() is of type EllaService and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
verify(mock).someMethod();
verify(mock, times(10)).someMethod();
verify(mock, atLeastOnce()).someMethod();
Если я правильно понимаю, ellaService — это тип @InjectMocks, а не @Mock. Следовательно, тест не выполняется.
Как правильно написать тест?




Проблема в том, что вы можете проверить только имитированные компоненты (с аннотацией @Mock). EllaService — это не moc, а экземпляр реального класса из вашего кода. Аннотация @ InjectMock просто устанавливает приватные поля EllaService с моками.
Как правило, при тестировании метода void вам необходимо убедиться, что некоторые фиктивные компоненты были вызваны с ожидаемыми параметрами, поэтому вам нужно проверить не вызов ellaService, а вызов фиктивных компонентов, который используется в методе invokeEllaAsync.
Не могли бы вы проверить тест, на который я добавил ответ?
После того, как я прочитал ответ, я добавил этот тест в кодовую базу.
@Test
public void testInvokeEllaAsyncSuccessfullyCallsCallEllaService() {
ellaService.invokeEllaAsync( validIrisBo );
PowerMockito.verifyStatic( EllaDtoConverter.class, VerificationModeFactory.times( 1 ) );
EllaDtoConverter.convertToRequest( validIrisBo );
verify( connectorMock, times( 1 ) ).call( any(), (HttpHeaders) any() );
}
Вы должны добавить это в свой исходный пост, а не в ответ, он может быть удален администратором.
@Арефе отлично выглядит. Насколько я помню, вы можете использовать любой (HttpHeaders.class)
@ alexey28 Я пробовал, но не работает. Я обновил тест с помощью PowerMock для статического метода. Хотя я частично осознаю, что тестирование методов static не очень хорошо, это конвертер, и он мне понадобится.
Это ответ или код относится к вопросу?
Это ответ. Я узнал из ответа @alexey28 и создал его позже.
Нет,
ellaServiceотносится к типуEllaService.@InjectMocksозначает, что вы вводите в него свои моки. Это не делает его насмешкой. Кроме того, это то, что вы тестируете, поэтому вы не хотите, чтобы это было макетом.