java - Mockito - 如何用自定义对象回答

标签 java spring testing spring-boot mockito

尝试像这样测试构造:

@RequestMapping(value = "/test", method = POST)
public ResponseEntity test(@RequestBody TestRequest request, Errors errors) {

    testValidator.validate(request, errors); // Spring Validator interface impl


    if (errors.hasErrors())
        return new ResponseEntity(HttpStatus.BAD_REQUEST);

    return new ResponseEntity(HttpStatus.OK);
}

Errors 对象由框架而不是我传递,因此没有更好的方法来更改它的测试行为,除了使用 Mockito 的 Answer 之类的东西:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ExampleTest {

    @Autowired
    private TestRestTemplate testRestTemplate;

    @MockBean
    private TestValidator testValidator; 

    @Test
    public void test() {

        doAnswer(new Answer<Errors>() {

           @Override
           public Errors answer(InvocationOnMock invocation) throws Throwable {

             Errors errors = spy((Errors) invocation.getArguments()[1]);
             //errors.rejectValue("id", "id", "id rejected");

             doReturn(true).when(errors).hasErrors();

             return errors;
         }

      }).when(testValidator).validate(any(), any());

      ResponseEntity re = testRestTemplate
        .postForEntity("/test", new TestRequest(213L), String.class);

      assertEquals(HttpStatus.BAD_REQUEST, re.getStatusCode());
  }

... 但问题是 errors.hasErrors() 仍然返回 false 尽管 doAnswer 测试 block 并且断言失败是因为HTTP 状态 OK。我希望 Errors 对象在 .validate() 调用后立即成为具有指定行为的 spy ,但似乎我做错了什么。

那么,如何使用 Mockito 的 doAnswer 返回自定义对象?

最佳答案

不要在测试中使用 postForEntity,因为这会使它成为框架本身的集成测试,加上您正在测试的实际类。

只需创建您自己的 Errors 对象,它可能是也可能不是 mock。如果是mock,那么可以如下设置。

doReturn(true).when(mockErrors).hasErrors();

然后你的测试看起来像这样。

@Test
public void test() {
  ResponseEntity re = objectThatYoureTesting.test(mockTestRequest, mockErrors);
  assertEquals(HttpStatus.BAD_REQUEST, re.getStatusCode());
}

关于java - Mockito - 如何用自定义对象回答,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39556869/

相关文章:

java - 找不到带有 URI 的 HTTP 请求的映射

java - 这个通用语法是什么意思?

spring - 通过环境变量设置 Spring boot yaml 配置列表属性

testing - 是否有一个命令可以从 clojure.test 和 Speclj 运行测试?

java - 模拟封装集合的对象

java - 在我的 WebView 中显示网站

java - 变量已在方法 lambda 中定义

java - Spring MVC 重定向是在 url 中添加一些参数

Spring 安全/OAuth : mapping between Principal's authority and role in @RolesAllowed

ruby-on-rails - 在 RSpec 中引用类名