Как издеваться над EntityBus.rxSend () - PullRequest
0 голосов
/ 03 сентября 2018

Метод io.vertx.reactivex.core.eventbus.EventBus.rxSend() имеет следующую подпись:

public <T> Single<Message<T>> rxSend(String address,
                                     Object message,
                                     DeliveryOptions options)

Как правильно смоделировать это так, чтобы он возвращал Single, содержащий реальный объект? Проблема в том, что класс Message не имеет конструктора, кроме того, который принимает другой объект Message. Таким образом, будет скомпилировано следующее:

Mockito.when(eventBus.rxSend(Mockito.isA(String.class), 
   Mockito.isA(JsonObject.class), 
   Mockito.isA(DeliveryOptions.class))).thenReturn(Single.just(new Message<Object>(null)));

но, конечно, Single.just(new Message<Object>(null)) не содержит реального объекта, который затем может быть передан для проверки следующего обработчика в вертикалке.

Спасибо

1 Ответ

0 голосов
/ 04 сентября 2018

Как я уже упоминал в своем комментарии, у меня нет ответа на ваш ближайший вопрос, но вместо этого я хотел бы рекомендовать другой подход к получению результатов, которые вы ищете.

насмешливым типам, которые вам не принадлежат, обычно не рекомендуется по разным причинам. два, которые резонируют больше всего со мной (как я стал жертвой):

  • если реальная реализация смоделированной зависимости изменится, поведение макета автоматически не выявит каких-либо прорывных изменений.
  • чем больше мошенничества вводит тест, тем больше когнитивная нагрузка несет тест. и некоторые тесты требуют много макетов для работы.

Есть много статей на эту тему с более подробными точками зрения и мнениями. если вам интересно, обратитесь к 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);
            }
    );
}

Я надеюсь, что это, по крайней мере, вдохновляет на новое мышление вокруг вашей проблемы.

...