我目前正在尝试使用Jooby编写webapps/apis。我将其设置为一个端点,该端点根据accept头的值返回帐户数据,可以是HTML格式,也可以是JSON格式。此端点工作并返回正确的信息。
在JUnit中编写单元测试时,如何将accept标头值与get请求一起传递,以便正确测试请求返回的内容?
我曾尝试使用Mockito模拟一个Request对象,并返回对request对象的各种调用的响应,但在文档中我似乎找不到当您使用Results.when方法时,Jooby如何测试它自己的Request对象中的头值。
这是我的端点:
get("/allAccounts", () ->
Results
.when(MediaType.html, () -> Results.html("display").put("accounts", accounts))
.when(MediaType.json, () -> accounts)
.when("*", () -> Status.NOT_ACCEPTABLE)
);到目前为止,尝试的测试都类似于以下内容。我尝试了许多不同的方法来代替'type()‘,比如.accept(),但似乎没有一个方法被查询到,因为MockRouter的get()方法在任何情况下都不会返回字符串
@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的字符串。
相反,我得到一个错误,我正在尝试将一个结果对象转换为一个字符串。
我是不是真的误解了?
发布于 2019-02-07 21:09:10
这是正确的,这基本上是单元测试和集成测试之间的区别。
对于单元测试,MockRouter所做的就是调用路由处理函数,函数/allAccounts会返回一个结果对象,这就是为什么会出现类转换异常的原因。
这里是您的示例,但使用了通过result.get()访问值的Result
@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());
}希望这能有所帮助。
https://stackoverflow.com/questions/54563778
复制相似问题