Как я уже упоминал в своем комментарии, у меня нет ответа на ваш ближайший вопрос, но вместо этого я хотел бы рекомендовать другой подход к получению результатов, которые вы ищете.
насмешливым типам, которые вам не принадлежат, обычно не рекомендуется по разным причинам. два, которые резонируют больше всего со мной (как я стал жертвой):
- если реальная реализация смоделированной зависимости изменится, поведение макета автоматически не выявит каких-либо прорывных изменений.
- чем больше мошенничества вводит тест, тем больше когнитивная нагрузка несет тест. и некоторые тесты требуют много макетов для работы.
Есть много статей на эту тему с более подробными точками зрения и мнениями. если вам интересно, обратитесь к Mockito wiki или просто к Google.
учитывая все это, вместо насмешки EventBus
, почему бы не использовать фактический экземпляр и не получить реальный ответ Messages
, составленный структурой? Конечно, строго говоря, это становится скорее интеграционным тестом, чем модульным, но ближе к типу тестирования, который вы хотите.
вот пример фрагмента из теста, который я написал в существующем проекте с некоторыми добавленными комментариями. (код относится к некоторым нестандартным типам с суффиксом «Ext», но они не характерны для подхода).
private EventBus eventBus;
@Before
public setUp(@NotNull TestContext context) {
eventBus = Vertx.vertx().eventBus()
}
@Test
public void ping_pong_reply_test(@NotNull TestContext context) {
final Async async = context.async();
// the following is a MessageConsumer registered
// with the EventBus for this specific test.
// the reference is retained so that it can be
// "unregistered()" upon completion of this test
// so as not to affect other tests.
final MessageConsumer<JsonObject> consumer = eventBus.consumer(Ping.class.getName(), message -> {
// here is where you would otherwise place
// your mock Message generation.
MessageExt.replyAsJsonObject(message, new Pong());
});
final Ping message = new Ping();
final DeliveryOptions options = null;
// the following uses an un-mocked EventBus to
// send an event and receive a real Message reply.
// created by the consumer above.
EventBusExt.rxSendJsonObject(eventBus, message, options).subscribe(
result ->
// result.body() is JSON that conforms to
// the Pong type
consumer.unregister();
async.complete();
},
error -> {
context.fail(error);
}
);
}
Я надеюсь, что это, по крайней мере, вдохновляет на новое мышление вокруг вашей проблемы.