Spring Boot 1.4 имеет ряд прекрасных функций, включая аннотацию @DataJpaTest, которая автоматически пробуждает встроенную базу данных классов для тестовых целей. Насколько я знаю, он не будет работать в сочетании с TestRestTemplate в рамках одного класса.Spring Boot 1.4 - как протестировать контроллер с валидацией
Следующий тест не будет работать:
@RunWith(SpringRunner.class)
@SpringBootTest
@DataJpaTest
public class PersonControllerTest {
private Logger log = Logger.getLogger(getClass());
private Category category;
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private TestEntityManager entityManager;
@Before
public void init() {
log.info("Initializing...");
category = entityManager.persist(new Category("Staff"));
}
@Test
public void personAddTest() throws Exception {
log.info("PersonAdd test starting...");
PersonRequest request = new PersonRequest("Jimmy");
ResponseEntity<String> response = restTemplate.postForEntity("/Person/Add", request, String.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
log.info("PersonAdd test passed");
}
При запуске теста исключение будет выброшено:
Unsatisfied dependency expressed through field 'restTemplate':
No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate]
Затем догадываясь, чтобы перейти к рекомендованному макету на основе ломтика подхода, но это не будет работать там, потому что контроллер выглядит следующим образом:
@RequestMapping(value="/Person/Add", method=RequestMethod.POST)
public ResponseEntity personAdd(@Valid @RequestBody PersonRequest personRequest,
Errors errors)
personValidator.validate(personRequest, errors):
if (errors.hasErrors())
return new ResponseEntity(HttpStatus.BAD_REQUEST);
personService.add(personRequest);
return new ResponseEntity(HttpStatus.OK);
}
... это легко макет personService
, как предполагает документация, но как быть с объектом errors
, который в этом случае не является насмешкой? Насколько я знаю, нет способов издеваться над ним, поскольку это не поле класса или возвращаемое значение метода.
Таким образом, я не могу протестировать код выше, не используя ни среза подход, ни интеграцию, поскольку @DataJpaTest
не должен использоваться с контроллером.
Есть ли способ протестировать контроллер с такой архитектурой, используя функции тестирования Spring Boot 1.4?
Вместо того, чтобы издеваться над методом контроллера, вы можете высмеять URL-адрес. Это позаботится об ошибке. Проверьте это сообщение http://stackoverflow.com/a/12308698/5343269 – 11thdimension
@ 11thdimension Worth, указывая на то, что с Spring Boot 1.4 аннотации слегка изменились, и вам не нужно создавать MockMvc, вместо этого он может быть автообновлен. Подробнее см. Https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4. –
@wilddev Если бы вы могли включить свой тестовый класс, который вы пытаетесь использовать, мы можем дать некоторые предложения о том, как заставить его работать так, как вы ожидаете. –