【发布时间】:2016-09-18 10:54:31
【问题描述】:
尝试像这样测试构造:
@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 测试块上并且断言由于HTTP 状态OK 而失败。我预计Errors 对象将在.validate() 调用后立即成为具有指定行为的间谍,但似乎我做错了什么。
那么,如何使用 Mockito 的 doAnswer 返回自定义对象?
【问题讨论】:
-
按照你的方式,你如何将你的testValidator“注入”到被测试的实例中?
-
(我也建议你使用spring-mvc-test)
-
@RC.,使用新的 Spring 测试功能
@MockBean注释,其行为与 Mockito 的@Mock完全相同 -
@RC.,由于 Spring 引入了另一种
slice方法,该方法似乎已被弃用
标签: java spring testing spring-boot mockito