首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地对根据MediaType返回不同内容的路由进行单元测试?

如何正确地对根据MediaType返回不同内容的路由进行单元测试?
EN

Stack Overflow用户
提问于 2019-02-07 06:49:50
回答 1查看 224关注 0票数 0

我目前正在尝试使用Jooby编写webapps/apis。我将其设置为一个端点,该端点根据accept头的值返回帐户数据,可以是HTML格式,也可以是JSON格式。此端点工作并返回正确的信息。

在JUnit中编写单元测试时,如何将accept标头值与get请求一起传递,以便正确测试请求返回的内容?

我曾尝试使用Mockito模拟一个Request对象,并返回对request对象的各种调用的响应,但在文档中我似乎找不到当您使用Results.when方法时,Jooby如何测试它自己的Request对象中的头值。

这是我的端点:

代码语言:javascript
复制
get("/allAccounts", () ->
   Results
          .when(MediaType.html, () -> Results.html("display").put("accounts", accounts))
          .when(MediaType.json, () -> accounts)
          .when("*", () -> Status.NOT_ACCEPTABLE)
);

到目前为止,尝试的测试都类似于以下内容。我尝试了许多不同的方法来代替'type()‘,比如.accept(),但似乎没有一个方法被查询到,因为MockRouter的get()方法在任何情况下都不会返回字符串

代码语言:javascript
复制
@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 );
}

我期望(也许是错误的)当我通过MockRouter发出get请求时,无论是"accept: text/ html“还是"accept: application/ json”,它都应该返回一个分别包含html或json的字符串。

相反,我得到一个错误,我正在尝试将一个结果对象转换为一个字符串。

我是不是真的误解了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-07 21:09:10

这是正确的,这基本上是单元测试和集成测试之间的区别。

对于单元测试,MockRouter所做的就是调用路由处理函数,函数/allAccounts会返回一个结果对象,这就是为什么会出现类转换异常的原因。

这里是您的示例,但使用了通过result.get()访问值的Result

代码语言:javascript
复制
  @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());

  }

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54563778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档