响应实体应返回http状态为OK / 200的新ResponseEntity。但是,在测试期间,它返回为null,我可以看到将其设置为null的位置,但不知道为什么甚至如何。我确信这是我错过的一件简单的事情,但看不到它。
从图像中可以看出,create var为null,但是,Mockitio应该将此设置为createBlogPostResponse1,因此我不确定为什么要设置null。
感谢您提供任何信息和帮助。
测试
public static ResponseEntity createBlogPostResponse1 = new ResponseEntity(HttpStatus.OK);
@Test
public void createNewBlogPost() throws Exception {
String url = TestHelper.URL + "/blogPost/createNewBlogPost";
when(postService.createNewBlogPost(blogPost1)).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(blogPost1);
verifyNoMoreInteractions(postService);
}
控制器
ResponseEntity create = postService.createNewBlogPost(cleanBlogPost);
服务
@Override
public ResponseEntity createNewBlogPost(BlogPost createNewBlogPost) {
return new ResponseEntity(HttpStatus.OK);
}
答案 0 :(得分:2)
正如JBnizet所指出的,mockito内部使用equals
方法来匹配模拟方法调用中的参数。尝试覆盖equals
类的BlogPost
方法。如果您不想覆盖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);
}
如果您想对匹配器有一些基本了解,请尝试this教程。
答案 1 :(得分:1)
如前所述,Mockito依靠equals()
进行参数匹配,但是重写equals()
来使单元测试成功通常不是一个好主意。 equals()
覆盖必须对相关类有所了解。如果覆盖有意义,那就去做吧。
否则,这里是一种替代方法,您可以结合使用any()
匹配器来检查param属性值的内容,例如:
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。