Как написать модульный тест для конечной точки контроллера загрузки Spring
у меня есть пример приложения Spring Boot со следующим
загрузить основной класс
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
контроллер
@RestController
@EnableAutoConfiguration
public class HelloWorld {
@RequestMapping("/")
String gethelloWorld() {
return "Hello World!";
}
}
какой самый простой способ написать модульный тест для контроллера? Я попробовал следующее, Но он жалуется на неспособность autowire WebApplicationContext
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class)
public class DemoApplicationTests {
final String BASE_URL = "http://localhost:8080/";
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void testSayHelloWorld() throws Exception{
this.mockMvc.perform(get("/")
.accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
.andExpect(status().isOk())
.andExpect(content().contentType("application/json"));
}
@Test
public void contextLoads() {
}
}
4 ответов:
Spring MVC предлагает standaloneSetup что поддерживает тестирование относительно простых контроллеров, без необходимости контекста.
создайте MockMvc, зарегистрировав один или несколько экземпляров @Controller и программная настройка инфраструктуры Spring MVC. Это позволяет полный контроль над созданием и инициализация контроллеров, и их зависимости, похожие на простые модульные тесты, а также делая возможно испытать один регулятор на время.
пример теста для вашего контроллера может быть что-то просто
public class DemoApplicationTests { private MockMvc mockMvc; @Before public void setup() { this.mockMvc = standaloneSetup(new HelloWorld()).build(); } @Test public void testSayHelloWorld() throws Exception { this.mockMvc.perform(get("/").accept(MediaType.parseMediaType("application/json;charset=UTF-8"))) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")); } }
новые улучшения тестирования, которые дебютировали в Spring Boot
1.4.M2может помочь уменьшить количество кода, необходимого для написания таких ситуаций.тест будет выглядеть так:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringRunner.class) @WebMvcTest(HelloWorld.class) public class UserVehicleControllerTests { @Autowired private MockMvc mockMvc; @Test public void testSayHelloWorld() throws Exception { this.mockMvc.perform(get("/").accept(MediaType.parseMediaType("application/json;charset=UTF-8"))) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")); } }посмотреть этой сообщение в блоге для более подробной информации, а также документация
вот еще один ответ с помощью Spring MVC standaloneSetup. Используя этот способ, вы можете либо автоматически подключить класс контроллера, либо издеваться над ним.
import static org.mockito.Mockito.mock; import static org.springframework.test.web.server.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.server.result.MockMvcResultMatchers.content; import static org.springframework.test.web.server.result.MockMvcResultMatchers.status; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.server.MockMvc; import org.springframework.test.web.server.setup.MockMvcBuilders; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class DemoApplicationTests { final String BASE_URL = "http://localhost:8080/"; @Autowired private HelloWorld controllerToTest; private MockMvc mockMvc; @Before public void setup() { this.mockMvc = MockMvcBuilders.standaloneSetup(controllerToTest).build(); } @Test public void testSayHelloWorld() throws Exception{ //Mocking Controller controllerToTest = mock(HelloWorld.class); this.mockMvc.perform(get("/") .accept(MediaType.parseMediaType("application/json;charset=UTF-8"))) .andExpect(status().isOk()) .andExpect(content().mimeType(MediaType.APPLICATION_JSON)); } @Test public void contextLoads() { } }
добавлять
@WebAppConfiguration(org.springframework.test.context.web.WebAppConfiguration) аннотация к вашему классу DemoApplicationTests будет работать.
Comments