@SpringBootTest для приложения без весенней загрузки

#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;
}