#java #spring #testing #spring-boot
#java #spring #тестирование #весенняя загрузка
Вопрос:
Я создаю приложение без весенней загрузки, используя spring-rest, spring-data-jpa и т. Д., И я хотел бы провести интеграционное тестирование с использованием spring boot (1.4.1.RELEASE). Обратите внимание, что у меня нигде нет класса SpringApplication или аннотации @SpringApplication
В моем тестовом классе у меня есть
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = MyConfiguration.class)
public class MyIT { }
@RestController
public class MyController { }
Это запускает встроенный tomcat, и я вижу, что мой контроллер инициализируется, однако я получаю 404 при вызове моей службы с помощью TestRestTemplate. Похоже, что DispatcherServlet, похоже, не знает о моих контроллерах
Кроме того, мне пришлось определить компонент servletContainer следующим образом
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.setPort(9000);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
return factory;
}
Мне не хватает какой-либо конфигурации для Spring, чтобы мои контроллеры были видны встроенному tomcat? Я попытался использовать @EnableAutoConfiguration @ComponentScan в тестовом классе, но они не имеют никакого эффекта. Я потратил два дня на это, и любые подсказки очень ценятся!!
Завершите класс MyIT
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = { TestContextConfiguration.class })
public class MyIT {
@Value("${local.server.port}")
private int serverPort;
@Resource
private TestRestTemplate restTemplate;
@Test
public void test() throws Exception {
System.out.println("Port:" serverPort);
System.out.println("Hello:" this.restTemplate.getForEntity("/", String.class));
}
}
Класс контроллера
@RestController
public class MyController {
@GetMapping("/")
public String hello() {
System.out.println("Hello called");
return "Hello";
}
}
Результат теста
Port:9000
Hello:<404 Not Found,<!DOCTYPE html><html><head><title>Apache Tomcat/8.5.5 - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 404 - /</h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u>/</u></p><p><b>description</b> <u>The requested resource is not available.</u></p><hr class="line"><h3>Apache Tomcat/8.5.5</h3></body></html>,{Content-Type=[text/html;charset=utf-8], Content-Language=[en], Content-Length=[992], Date=[Wed, 05 Oct 2016 14:26:46 GMT]}>
Комментарии:
1. Не могли бы вы поделиться моим контентом?
2. Добавлен полный класс MyIT
3. Вы запрашиваете «/» с помощью RestTemplate, обрабатываете ли вы @RequestMapping(значение = «/», метод = RequestMethod . GET) в вашем контроллере rest MyController
4. да, я делаю. Используется @Getmapping(«/»)
5. У меня есть отдельный JUnit только для контроллера, использующего MockMvc, и он отлично работает
Ответ №1:
Этого можно достичь, создав внутренний класс TestConfig и аннотировав его с помощью @SpringBootConfiguration, например:
@SpringBootConfiguration
public static class TestConfig {
}
Затем в вашем тестовом классе:
@RunWith(SpringRunner.class)
@SpringBootTest(...)
@Import(MyIT.TestConfig.class)
public class MyIT {
@SpringBootConfiguration
@ComponentScan("com.example")
public static class TestConfig {
}
}
Обратите внимание, что класс TestConfig также имеет аннотацию @ComponentScan . Это используется Spring для поиска компонентов вашего приложения.
Комментарии:
1. Хотя это решение работает довольно сложно и сложно поддерживать.
Ответ №2:
Создайте тестовую конфигурацию, которая определяет компоненты, которые вы хотите использовать, аннотируйте с помощью @TestConfiguration
@TestConfiguration
public class TestConfig {
@Bean
public Faker getFaker() {
return new Faker();
}
}
Тогда вашему тестовому классу понравится это
@SpringBootTest(classes = {MyService.class,TestConfig.class})
@RunWith(SpringRunner.class)
public class MyIT {
@Autowired
MyService myService;
@Autowired
Faker faker;
}