Статьи

Разница между @ContextConfiguration и @SpringApplicationConfiguration в тесте интеграции Spring Boot

Хотя аннотации @ContextConfiguration и @SpringApplicationConfiguration используются вместе с SpringJUnit4ClassRunner для указания способа загрузки контекста приложения Spring, между ними есть SpringJUnit4ClassRunner разница. Хотя @ContextConfiguration отлично справляется с загрузкой контекста приложения, он не в полной мере использует возможности Spring Boot . Приложения Spring Boot в конечном итоге загружаются либо SpringApplication (в случае JAR), либо SpringBootServletInitializer . Этот класс не только загружает контекст приложения, но также позволяет регистрировать и загружать внешние свойства, указанные в файле application.properties или application.yml, а также другие функции среды Spring Boot, которая не загружается и не включается
@ContextConfiguration аннотация.


Короче говоря, лучше использовать аннотации @SpringApplicatoinConfiguration а не @ContextConfiguration для написания интеграционного теста для загрузочного приложения Spring, включая тест для веб-страниц или @ContextConfiguration интерфейса приложения.

Теперь, когда вы знаете существенную разницу между аннотациями @ContextConfiguration и @SpringApplicationConfiguration при написании загрузочных тестов Spring , давайте @SpringApplicationConfiguration в этом немного подробнее с некоторыми примерами кода.

Spring Framework имеет отличную поддержку для написания интеграционных тестов начиная с Spring 2.5, когда он представил SpringJUnit4ClassRunner и то же самое касается тестирования с приложением Spring Boot. Во время теста интеграции вам также нужно загрузить компоненты и связать их с зависимостями.

Конечно, вы можете сделать это вручную, но лучше, если Spring выполнит их за вас, что и делает. Он также предлагает готовые функции, такие как сканирование компонентов, автоматическое подключение, управление транзакциями декларирования, безопасность и кэширование, что удобно для тестирования в более производственной среде.

Spring Boot — пример @ ContextConfiguration

Вот простой интеграционный тест Spring с SpringJUnit4ClassRunner и аннотацией @ContextConfiguration , одной из основных аннотаций загрузки Spring для загрузки контекста приложения:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=BookConfiguration.class)
public class BookServiceTest {
 
 
@Autowired
private BookService bookService;
 
 
@Test
public void testBookService() {
  Book aBook = bookService.findByTitle("Spring Boot in Action");
  assertEquals("Craig Walls", aBook.getAuthor());
  assertEquals(40, aBook.getPrice());
}
 
}

Как вы можете видеть, класс BookServiceTest аннотируется как аннотацией @RunWith JUnit, так и аннотацией @ContextConfiguration.

Аннотация @RunWith необходима для включения тестирования интеграции Spring, и поэтому мы передали SpringJUnit4ClassRunnner класс SpringJUnit4ClassRunnner , а аннотация @ContextConfiguration указывает, как загружать контекст приложения.

В этом примере будет загружен контекст приложения Spring, определенный в классе BookConfiguration .

SpringJUnit4ClassRunner — это мощный класс, который не только загружает контекст приложения, но и автоматически передает bean-компоненты в тест.

Например, в этом тестовом классе нам понадобился BookService для тестирования его findByTitle() и этот бин автоматически SpringJUnit4ClassRunner классом SpringJUnit4ClassRunner поэтому мы просто оставили писать
Метод testBookService ().

Интеграционный тест

Теперь, возвращаясь к @ContextConfiguration , несмотря на то, что он помогает загружать контекст приложения, он не включает ведение журнала или загрузку дополнительных свойств из application.properties, например, свойства server.port, которое требуется для изменения порта встроенного сервера tomcat при весенней загрузке. заявление.

Чтобы решить эту проблему, вы можете использовать аннотацию @SpringApplicaitonCongifguation вместо @ContextConfiguration как показано ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicaitonCongifguation(classes=BookConfiguration.class)
public class BookServiceTest {
 
@Autowired
private BookService bookService;
 
 
@Test
public void testBookService() {
  Book aBook = bookService.findByTitle("Cloud Native Java");
  assertEquals("Josh Long", aBook.getAuthor());
  assertEquals(40, aBook.getPrice());
}
}

Он будет вести себя так же, как и в предыдущем примере, но @SpringApplicationConfiguration также включит ведение журнала загрузки Spring и загрузит дополнительные свойства, определенные в файле application.properties или application.yml.

Вот и все о разнице между аннотацией @ContextConfiguration и @SpringApplicationConfiguration в Spring Boot . Несмотря на то, что оба они используются вместе с SpringJUnit4ClassRunner и помогают в загрузке контекста приложения, позднее это будет более полезным, поскольку оно также позволяет вести SpringJUnit4ClassRunner и другие функции SpringJUnit4ClassRunner Boot.

Всегда лучше использовать @SpringApplicationConfiguration при написании интеграционного теста для приложения Spring Boot, чтобы максимально приблизить его к @SpringApplicationConfiguration тесту.

Спасибо за чтение этой статьи до сих пор. Если вам нравится мое объяснение аннотации @SpringApplicationConfiguration или @ContextConfiguration поделитесь с друзьями и коллегами. Если у вас есть какие-либо вопросы или пожелания, напишите нам.

См. Оригинальную статью здесь: Разница между @ContextConfiguration и @SpringApplicationConfiguration в тесте интеграции Spring Boot

Мнения, высказанные участниками Java Code Geeks, являются их собственными.