В предыдущей части мы рассмотрели, как использовать инструменты тестирования Spring для тестирования проектов Spring. Теперь мы рассмотрим, как использовать инструменты тестирования Spring Boot для тестирования проектов Spring Boot.
В проекте Spring Boot можно использовать как инструменты тестирования Spring Boot, так и инструменты тестирования Spring. В проектах Spring обычно используют инструменты тестирования Spring, хотя теоретически можно использовать и инструменты тестирования Spring Boot. Однако, поскольку инструменты тестирования Spring Boot могут привнести некоторые особенности Spring Boot в тестирование, что может вызвать странные проблемы, обычно не рекомендуется это делать.
Чтобы использовать инструменты тестирования Spring Boot, достаточно заменить @ContextConfiguration
на @SpringBootTest
. Исходный код см. в FooServiceImpltest:
@SpringBootTest(classes = FooServiceImpl.class)
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
@Autowired
private FooService foo;
@Test
public void testPlusCount() throws Exception {
assertEquals(foo.getCount(), 0);
foo.plusCount();
assertEquals(foo.getCount(), 1);
}
}
Исходный код см. в FooServiceImpltest:
@SpringBootTest
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
@Autowired
private FooService foo;
@Test
public void testPlusCount() throws Exception {
assertEquals(foo.getCount(), 0);
foo.plusCount();
assertEquals(foo.getCount(), 1);
}
@Configuration
@Import(FooServiceImpl.class)
static class Config {
}
}
@Configuration
@Import(FooServiceImpl.class)
public class Config {
}
@SpringBootTest(classes = Config.class)
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
@Autowired
private FooService foo;
@Test
public void testPlusCount() throws Exception {
assertEquals(foo.getCount(), 0);
foo.plusCount();
assertEquals(foo.getCount(), 1);
}
}
Этот пример похож на пример 2, но @Configuration
вынесена наружу.
Использование @SpringBootTest
аналогично использованию @ContextConfiguration
. Согласно документации @SpringBootTest
:
@SpringBootTest (classes=...)
, если они заданы. Определение классов с аннотациями описано в ContextConfiguration
.@SpringBootTest (classes=...)
, то он ищет вложенный класс @Configuration
текущего тестового класса.@SpringBootConfiguration
, ища его следующим образом:
@SpringBootConfiguration
.Поэтому мы можем использовать эту функцию для дальнейшего упрощения кода тестирования.
@SpringBootConfiguration
@Import(FooServiceImpl.class)
public class Config {
}
@SpringBootTest
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
@Autowired
private FooService foo;
@Test
public void testPlusCount() throws Exception {
assertEquals(foo.getCount(), 0);
foo.plusCount();
assertEquals(foo.getCount(), 1);
}
}
Во всех предыдущих примерах мы использовали @Import
для загрузки Bean, хотя этот метод очень точный, он может быть громоздким в больших проектах.
Обычно в обычных проектах Spring Boot используется автоматическое сканирование для загрузки Bean, поэтому мы хотим, чтобы наш тестовый код также мог использовать автоматическое сканирование для загрузки Bean.
@SpringBootConfiguration
@ComponentScan(basePackages = "me.chanjar.basic.service")
public class Config {
}
@SpringBootTest
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
@Autowired
private FooService foo;
@Test
public void testPlusCount() throws Exception {
assertEquals(foo.getCount(), 0);
foo.plusCount();
assertEquals(foo.getCount(), 1);
}
}
Также можно использовать @SpringBootApplication
в тестовом коде. У него есть несколько преимуществ:
@SpringBootConfiguration
.@ComponentScan
, а также default excludeFilter, благодаря чему Spring при инициализации ApplicationContext исключает некоторые Bean и @Configuration
.EnableAutoConfiguration
, что позволяет использовать Spring Boot для автоматической настройки необходимых внешних ресурсов, таких как базы данных и JMS, что полезно при интеграционном тестировании.@SpringBootApplication(scanBasePackages = "me.chanjar.basic.service")
public class Config {
}
@SpringBootTest
public class FooServiceImplTest extends
``` **Избегаем конфликта @SpringBootConfiguration**
Когда `@SpringBootTest` не определяет `(classes=...`, и не найден nested `@Configuration` class, будет предпринята попытка поиска `@SpringBootConfiguration`. Если найдено несколько таких классов, то будет выброшено исключение:
Caused by: java.lang.IllegalStateException: Found multiple @SpringBootConfiguration annotated classes [Generic bean: class [...]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/Users/qianjia/workspace-os/spring-test-examples/basic/target/test-classes/me/chanjar/basic/springboot/ex7/FooServiceImplTest1.class], Generic bean: class [me.chanjar.basic.springboot.ex7.FooServiceImplTest2]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [...]]
Например, следующий код вызовет эту проблему:
```java
@SpringBootApplication(scanBasePackages = "me.chanjar.basic.service")
public class Config1 {
}
@SpringBootApplication(scanBasePackages = "me.chanjar.basic.service")
public class Config2 {
}
@SpringBootTest
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
// ...
}
Чтобы решить эту проблему, можно избежать автоматического поиска @SpringBootConfiguration
:
@SpringBootTest(classes=...)
@Configuration
classЛучшая практика
Кроме модульного тестирования (не требуется инициализация ApplicationContext
), рекомендуется максимально согласовывать тестовую конфигурацию с производственной конфигурацией. Например, если в производственной конфигурации включена AutoConfiguration, то и в тестовой конфигурации она должна быть включена. Только так можно обнаружить проблемы в производственной среде в тестовом окружении и избежать некоторых странных проблем, вызванных различиями в конфигурации.
Между тестовыми кодами следует стараться использовать общую конфигурацию, что имеет три преимущества:
@Configuration
или её вариант, это было бы очень сложно.Справочные документы
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )