Java SpringBoot MVC Post响应实体返回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

响应entity应返回http状态为OK/200的新响应entity。然而,在我的测试过程中,它返回为null,我可以看到它被设置为null的位置,但不明白为什么,甚至不知道如何设置。我确信这是一件简单的事情,我错过了,但就是看不见

如图中所示,create变量为null,但是,Mockitio应该将其设置为createBlogPostResponse1,因此我不确定设置null的原因

谢谢你在这方面提供的任何信息和帮助

试验

控制器

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();
                   });