我是Vert.x 3的新手,我正在尝试为简单的事件处理程序编写单元测试。现在,我要做的就是检查受测试的Verticle是否委托给正确的组件,该组件是使用Mockito创建的。
我的测试代码类似于:
@Rule
public final RunTestOnContext vertxRule = new RunTestOnContext();
@Before
public void setUp(TestContext context) {
vertx = vertxRule.vertx();
//verticle is set up with mock delegate before deployment
vertx.deployVerticle(verticle);
}
@After
public void tearDown(TestContext context) {
vertx.close(context.asyncAssertSuccess());
}
@Test
public void testDelegate(TestContext context) {
EventBus eventBus = vertx.eventBus();
Event event = new Event("id", "description")
eventBus.publish("event.channel", Json.encode(event));
//Mockito.verify
verify(delegate).invokeMethod(anyString(), anyString());
}
Veticle包含类似于以下内容的代码:
private Delegate delegate;
@Override
public void start(Future<Void> future) throws Exception {
vertx.eventBus().consumer("event.channel", message -> {
logger.info("received!");
Event event = Json.decodeValue(message.body().toString(), Event.class);
delegate.invokeMethod(event.getId(), event.getDescription());
});
}
但是,每次运行测试时,我总是会收到一条错误,指出模拟没有被调用。我确信模拟对象正在被正确注入,因为如果我在事件总线构造之外调用它,则测试通过。此外,代码记录received!
信息,因此我确信测试执行到达那一点。我只是不确定为什么,在测试结束时,报告说没有与模拟对象的交互。
答案 0 :(得分:3)
在调用Mock之前执行验证。在验证之前,您应该在测试中等待异步。像这样:
@Test
public void testDelegate(TestContext context) {
EventBus eventBus = vertx.eventBus();
Event event = new Event("id", "description")
Async async = context.async();
eventBus.publish("event.channel", Json.encode(event) ,done ->async.complete());
async.await()
//Mockito.verify
verify(delegate).invokeMethod(anyString(), anyString());
}
然后你的Verticle必须在调用mock之后通过执行message.reply(...)来回复收到的消息。
在您的无回复评论后进行修改
我尝试了以下使用全局变量(丑陋)进行同步的代码(请注意,这是一个io.vertx.core.Future):
@RunWith(VertxUnitRunner.class)
public class StackTest {
private Vertx vertx;
public static Future<String> synchronisation = Future.future();
@Before
public void setUp(TestContext context) {
vertx = Vertx.vertx();
vertx.deployVerticle(new StackVerticle());
}
@Test
public void testPublish(TestContext context){
vertx.eventBus().publish("topic","message");
Async async = context.async();
synchronisation.setHandler(event -> async.complete());
async.await();
}
}
测试Verticle(必须由模拟触发synchronization.complete):
public class StackVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
vertx.eventBus().consumer("topic",received ->{
System.out.println("received");
StackTest.synchronisation.complete("done");
});
}
}