Java SpringBoot MVC Post响应实体返回null
响应entity应返回http状态为OK/200的新响应entity。然而,在我的测试过程中,它返回为null,我可以看到它被设置为null的位置,但不明白为什么,甚至不知道如何设置。我确信这是一件简单的事情,我错过了,但就是看不见 如图中所示,create变量为null,但是,Mockitio应该将其设置为createBlogPostResponse1,因此我不确定设置null的原因 谢谢你在这方面提供的任何信息和帮助 试验 控制器Java SpringBoot MVC Post响应实体返回null,java,spring,model-view-controller,mockito,Java,Spring,Model View Controller,Mockito,响应entity应返回http状态为OK/200的新响应entity。然而,在我的测试过程中,它返回为null,我可以看到它被设置为null的位置,但不明白为什么,甚至不知道如何设置。我确信这是一件简单的事情,我错过了,但就是看不见 如图中所示,create变量为null,但是,Mockitio应该将其设置为createBlogPostResponse1,因此我不确定设置null的原因 谢谢你在这方面提供的任何信息和帮助 试验 控制器 ResponseEntity create = post
ResponseEntity create = postService.createNewBlogPost(cleanBlogPost);
服务
@Override
public ResponseEntity createNewBlogPost(BlogPost createNewBlogPost) {
return new ResponseEntity(HttpStatus.OK);
}
正如JBnizet所指出的,mockito在内部使用
equals
方法来匹配mock方法调用中的参数。尝试重写BlogPost
类的equals
方法。如果您不想覆盖equals
,而只想匹配模拟上的任何方法调用,请使用any()
matcher:
@Test
public void createNewBlogPost() throws Exception {
String url = TestHelper.URL + "/blogPost/createNewBlogPost";
when(postService.createNewBlogPost(Mockito.any(BlogPost.class))).thenReturn(TestHelper.createBlogPostResponse1);
mockMvc.perform(post(url)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(TestHelper.asJsonString(blogPost1)))
.andExpect(status().isOk())
.andReturn();
verify(postService, times(1)).createNewBlogPost(Mockito.any(BlogPost.class));
verifyNoMoreInteractions(postService);
}
如果您想获得一些关于匹配器的基本知识,请尝试教程。如前所述,Mockito依赖
equals()
进行参数匹配,但覆盖equals()
使单元测试成功通常不是一个好主意。equals()
重写必须对相关类有意义。如果覆盖是有意义的,就去做吧。
否则,您可以使用any()
matcher组合检查参数属性值的内容,例如:
when(postService.createNewBlogPost(Mockito.any(BlogPost.class)))
.then( answer -> {
BlogPost post = (BlogPost) invocation.getArguments()[0]; // get the first arg
Assert.assertEquals(blogPost1.getFoo(), post.getFoo());
Assert.assertEquals(blogPost1.getBar(), post.getBar());
return TestHelper.createBlogPostResponse1();
});
而对于没有在要断言的对象上使用
equals()
的断言,我更喜欢AssertJ 使用eq()是无用的。默认情况下,Mockito使用equals()方法比较参数。不需要匹配器。谢谢你,我会看一下发布的教程,我还更新了你的答案,因为测试中的验证也需要你的答案来确保Octlete测试通过。
when(postService.createNewBlogPost(Mockito.any(BlogPost.class)))
.then( answer -> {
BlogPost post = (BlogPost) invocation.getArguments()[0]; // get the first arg
Assert.assertEquals(blogPost1.getFoo(), post.getFoo());
Assert.assertEquals(blogPost1.getBar(), post.getBar());
return TestHelper.createBlogPostResponse1();
});