내가 동기화 할 때 단위 테스트를 작성하여 지속성 부분을 조롱하고 호출자의 동작을 확인합니다. 여기에 내가 일반적으로 무엇을했는지에 대한 예입니다Vertx.io 비동기 처리기를 조롱
@Mock
private OfferPersistenceServiceImpl persistenceService;
@Inject
@InjectMocks
private OfferServiceImpl offerService;
...
@Test
public void createInvalidOffer() {
offer = new Offer(null, null, null, null, null, 4, 200D, 90D);
String expectedMessage = Offer.class.getName() + " is not valid: " + offer.toString();
Mockito.when(persistenceService.create(offer)).thenThrow(new IllegalArgumentException(expectedMessage));
Response response = offerService.create(offer);
Mockito.verify(persistenceService, Mockito.times(1)).create(offer);
Assert.assertEquals(INVALID_INPUT, response.getStatus());
String actualMessage = response.getEntity().toString();
Assert.assertEquals(expectedMessage, actualMessage);
}
는하지만 지금은 Vertx.io (이에 나는 아주 새로운 오전)와 사랑에 빠졌다 내가 비동기되고 싶어요. 좋은. 그래서
...
mongoClient.insert(COLLECTION, offer, h-> {
...
});
내가 그 mongoClient
심지어는 함께 테스트하는 올바른 방법 인 경우를 사용하고 테스트 클래스 처리기 h
을 조롱하는 방법을 추측하고있다 : 그러나 Vertx 핸들러 때문에,이 같은 모의 외모에 새 지속성 구성 요소가 Vertx.io. vertx.io 3.5.0
, junit 4.12
및 mockito 2.13.0
을 사용하고 있습니다. 감사.
업데이트 나는 tsegimond 제안을 따르려고 노력하지만 난 방법 Mockito의 Answer
을 얻을 수 ArgumentCaptor
나를 도울 수 있습니다. 여기 내가 지금까지 시도한 것이있다. ArgumentCaptor
사용 :
JsonObject offer = Mockito.mock(JsonObject.class);
Mockito.when(msg.body()).thenReturn(offer);
Mockito.doNothing().when(offerMongo).validate(offer);
RuntimeException rex = new RuntimeException("some message");
...
ArgumentCaptor<Handler<AsyncResult<String>>> handlerCaptor =
ArgumentCaptor.forClass(Handler.class);
ArgumentCaptor<AsyncResult<String>> asyncResultCaptor =
ArgumentCaptor.forClass(AsyncResult.class);
offerMongo.create(msg);
Mockito.verify(mongoClient,
Mockito.times(1)).insert(Mockito.anyString(), Mockito.any(), handlerCaptor.capture());
Mockito.verify(handlerCaptor.getValue(),
Mockito.times(1)).handle(asyncResultCaptor.capture());
Mockito.when(asyncResultCaptor.getValue().succeeded()).thenReturn(false);
Mockito.when(asyncResultCaptor.getValue().cause()).thenReturn(rex);
Assert.assertEquals(Json.encode(rex), msg.body().encode());
및 Answer
를 사용하여 :
ArgumentCaptor<AsyncResult<String>> handlerCaptor =
ArgumentCaptor.forClass(AsyncResult.class);
AsyncResult<String> result = Mockito.mock(AsyncResult.class);
Mockito.when(result.succeeded()).thenReturn(true);
Mockito.when(result.cause()).thenReturn(rex);
Mockito.doAnswer(new Answer<MongoClient>() {
@Override
public MongoClient answer(InvocationOnMock invocation) throws Throwable {
((Handler<AsyncResult<String>>)
invocation.getArguments()[2]).handle(handlerCaptor.capture());
return null;
}
}).when(mongoClient).insert(Mockito.anyString(), Mockito.any(),
Mockito.any());
userMongo.create(msg);
Assert.assertEquals(Json.encode(rex), msg.body().encode());
그리고 지금은 혼란 얻었다. AsyncResult
을 모방하여 succeed()
에 false를 반환하는 방법이 있습니까?
https://fernandocejas.com/2014/04/08/unit-testing-asynchronous-methods-with-mockito/ – tsegismont