尝试像这样测试构造:
@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/