Я использую Spring Boot 1.4.2 и Jersey (jax-rs) для создания контроллера REST. Я следил за документацией о том, как тестировать контроллеры REST (Testing the Spring MVC slice). Но мой тест возвращает 404, и я не могу понять, почему. Контроллер здесь упрощен, но проблема остается.Spring Boot 1.4.2 @WebMvcTest возвращает статус 404
Мой вопрос: как получить статус 200 при запуске теста?
HealthController.java
@Controller
@Path("/health")
public class HealthController {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Health health() {
return Health.up().build();
}
}
Запуск сервера и делать запрос дает мне эту
%> curl -i http://localhost:8080/health
HTTP/1.1 200
X-Application-Context: application
Content-Type: application/json
Content-Length: 21
Date: Sun, 27 Nov 2016 15:22:30 GMT
{
"status" : "UP"
}%
HealthControllerTest.java
@RunWith(SpringRunner.class)
@WebMvcTest(HealthController.class)
public class HealthControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void health() throws Exception {
mockMvc.perform(get("/health").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()); // 200 expected
}
}
Это то, что я получаю при запуске теста
. ____ _ __ _ _
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ))))
' |____| .__|_| |_|_| |_\__, |////
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.4.2.RELEASE)
2016-11-27 16:22:08.254 INFO 9029 --- [ main] no.avec.controller.HealthControllerTest : Starting HealthControllerTest on ducati.local with PID 9029 (started by avec in /Users/avec/Projects/RESTdemo)
2016-11-27 16:22:08.257 DEBUG 9029 --- [ main] no.avec.controller.HealthControllerTest : Running with Spring Boot v1.4.2.RELEASE, Spring v4.3.4.RELEASE
2016-11-27 16:22:08.257 INFO 9029 --- [ main] no.avec.controller.HealthControllerTest : No active profile set, falling back to default profiles: default
2016-11-27 16:22:09.294 INFO 9029 --- [ main] no.avec.controller.HealthControllerTest : Started HealthControllerTest in 1.421 seconds (JVM running for 2.132)
MockHttpServletRequest:
HTTP Method = GET
Request URI = /health
Parameters = {}
Headers = {Accept=[application/json]}
Handler:
Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandler
Async:
Async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
Attributes = null
MockHttpServletResponse:
Status = 404
Error message = null
Headers = {}
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
java.lang.AssertionError: Status
Expected :200
Actual :404
Вы также с помощью веб-безопасности Config? –
Вероятно, ваш контроллер не будет поднят весной, когда будет создан контекст для вашего теста. Попробуйте использовать '@SpringBootTest' в сочетании с '@AutoConfigureMockMvc', как описано здесь: http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/web/servlet/ WebMvcTest.html. – Tom
Когда вы * скручиваете * конечную точку '/ health', которую вы вызываете: конечная точка исполнительного механизма Spring Boot или ваш пользовательский контроллер?IMHO, конечная точка привода - причина того, что «curl -i http: // localhost: 8080/health» успешна, и ваш контроллер не получает вообще –