Java vertx로 작성된 두 개의 마이크로 서비스가 있습니다. 이벤트 버스를 통해 통신합니다. 첫 번째는 메시지를 보내고 두 번째는 메시지를받습니다.
첫 번째 아이디어 : 단위 테스트에서 Vertx eventbus 메시지에만 응답하십시오.
메시지가 오류없이 처리되고 있는지 테스트하고 싶으므로 응답을 확인하는 두 번째 마이크로 서비스에 단위 테스트를 작성합니다.
eventbus.send("address", message, reply -> {
if (reply.succeeded()) {
context.async().complete();
} else {
context.fail();
}});
이제 소비자에게 답장을 보내야하는데 테스트에서만하고 싶기 때문에 프로덕션에서 답장을 보낼 필요가 없습니다. 프로덕션에서 응답을 보내기 위해 CPU와 네트워크를 사용하고 싶지 않습니다. 그래서 내가 찾고있는 것은 다음과 같습니다.
vertx.eventBus().consumer("address", handler -> {
Boolean success = methodMayFail();
if ( MY_CONTEXT_IS_TEST || HANDLER_IS_LOCAL_AS_I_ONLY_SENT_LOCAL_MESSAGES_FROM_TEST) {
success ? handler.reply("ok") : handler.fail();
}
});
두 번째 생각은 뒤에 오는 cdelmas 주석 과에 내 자신의 대답
응답없이 비동기 이벤트 버스 핸들러를 테스트하려면 비즈니스 로직을 서비스로 추출하고 테스트 케이스를 두 개로 분할해야합니다. 첫 번째는 메시지 전달 용이고 두 번째는 비즈니스 로직 용입니다.
ConsumerVerticle은 다음과 같습니다.
class ConsumerVerticle extends AbstractVerticle {
// this service is injected somehow, for example as constructor parameter
private MyService service;
...
public void start() {
vertx.eventBus().consumer("address", handler -> {
service.methodMayFail();
});
}
}
비동기 테스트 methodMayFail()
에서 비동기를 보유 할 재정의 된 메서드로 서비스의 모의를 구현 합니다.
class MockService extends MyService() {
private Async async;
public MockService(Async async) {
this.async = async;
}
@Override public void methodMayFail() {
async.complete()
}
}
그런 다음 모의 서비스를 verticle에 삽입합니다.
MockService service = new MockService(context.async());
ConsumerVerticle consumerVerticle = new ConsumerVerticle(service);
...
eventbus.send("address", message)
다른 클래스에서 어딘가에 MyServiceTest
테스트의 구현 methodMayFail()
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다