簡體   English   中英

如何在Vert.x中對事件處理程序進行單元測試(來自事件總線)?

[英]How do I unit test event handlers (from the event bus) in Vert.x?

我是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! 信息,所以我確定測試執行到了這一點。 我只是不確定為什么在測試結束時,報告會說與模擬對象之間沒有交互。

驗證在調用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());
}

然后,您的頂點必須在調用模擬之后通過執行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();
    }
}  

和測試垂直線(必須由您的模擬物觸發sync.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");
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM