Joobie: Как правильно выполнить модульное тестирование маршрута, который возвращает различный контент в зависимости от MediaType? - PullRequest
0 голосов
/ 07 февраля 2019

В настоящее время я экспериментирую с написанием webapps / apis с использованием Jooby.У меня есть настроенная конечная точка, которая возвращает данные учетной записи, либо в виде HTML, либо в виде JSON, в зависимости от значения заголовка accept.Эта конечная точка работает и возвращает правильную информацию.

При написании модульных тестов в JUnit, как передать значение заголовка accept вместе с моим запросом get, чтобы я мог правильно проверить то, что возвращается из запроса?

Я пытался использовать Mockito для макета объекта Request и возврата ответов на различные вызовы объекта request, но я не могу найти в документации, как Jooby проверяет значения заголовка в своем собственном объекте Request при использованииметод Results.when.

Это моя конечная точка:

get("/allAccounts", () ->
   Results
          .when(MediaType.html, () -> Results.html("display").put("accounts", accounts))
          .when(MediaType.json, () -> accounts)
          .when("*", () -> Status.NOT_ACCEPTABLE)
);

Все проведенные до сих пор тесты были похожи на следующие.Я перепробовал много разностных методов вместо 'type ()', таких как .accept (), но ни один из них не был запрошен, так как метод get () MockRouter никогда не возвращает строку ни при одном из этих условий

@Test
public void allAccountsHTMLunitTest() throws Throwable {

    Request req = mock(Request.class);
    when(req.type()).thenReturn(MediaType.html);

    String result = new MockRouter(new App(), req)
        .get("/allAccounts");

    assertEquals(// some assertion );
}

Я ожидаю (возможно, ошибочно), что когда я делаю запрос get через MockRouter с заголовком «accept: text / html» или «accept: application / json», он должен вернуть строку, содержащую html или json соответственно.

Вместо этого я получаю сообщение об ошибке, которое пытаюсь привести объект Result к строке.

Серьезно ли я неправильно понимаю это?

1 Ответ

0 голосов
/ 07 февраля 2019

Это правильно, и это в основном разница между модульными и интеграционными тестами.

Для модульных тестов все, что MockRouter делает, это вызывает функцию-обработчик маршрута, функция /allAccounts возвращает объект Result, который являетсяпочему вы получили исключение приведения класса.

Вот ваш пример, но использование Result доступа к значению через result.get()

  @Test
  public void allAccountsHTMLunitTest() throws Throwable {

    Request req = mock(Request.class);
    when(req.type()).thenReturn(MediaType.html);

    Result result = new MockRouter(new App(), req)
        .get("/allAccounts");

    View view = result.get();
    assertEquals("display", view.name());
    assertEquals("{accounts=[1, 2]}", view.model().toString());

  }

Надеется, что это поможет.

...