не удалось внедрить контекст приложения в модульный тест Spring Boot, выполняемый с помощью @ExtendWith (SpringExtension.class )

#spring-boot #junit #junit5 #applicationcontext

#spring-boot #junit #junit5 #applicationcontext

Вопрос:

Я пытаюсь написать модульные тесты для конечной точки SOAP, написанной с использованием Spring boot. Изначально я писал тесты, используя @RunWith(SpringJUnit4ClassRunner.class) все тесты, которые были выполнены успешно. Однако, когда я пытаюсь обновить модульные тесты с помощью @ExtendWith(SpringExtension.class) , тесты не выполняются, поскольку он не может автоматически подключать ApplicationContext объект. Ниже приведена часть старого и нового кода.

Старый код:

 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestConfiguration.class})
public class ServiceEndPointTest {
    @Autowired
    private ApplicationContext applicationContext;
    private MockWebServiceClient mockClient;

    @Before
    public void setUp() {
        mockClient = MockWebServiceClient.createClient(applicationContext);
    }

  

Новый код:

 
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {TestConfiguration.class})
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ActiveProfiles(profiles = "unittest")
public class ServiceEndPointTest {
   
    @Autowired
    private ApplicationContext applicationContext;
    private MockWebServiceClient mockClient;

    
    @Before
    public void setUp() {
        mockClient = MockWebServiceClient.createClient(applicationContext);
    }

  

Я получаю сообщение об ошибке setUp() как applicationContext есть null .

 java.lang.IllegalArgumentException: 'applicationContext' must not be null

    at org.springframework.util.Assert.notNull(Assert.java:198)
    at org.springframework.ws.test.server.MockWebServiceClient.createClient(MockWebServiceClient.java:151)
    at com.test.ServiceEndPointTest.setUp(ServiceEndPointTest.java:80
  

Не уверен, чего здесь не хватает.

Пожалуйста, помогите.

Ответ №1:

Обычно подобные ошибки при переходе на junit 5 возникают из-за использования аннотаций Junit из пакетов junit 4. Предоставленный вами тестовый класс содержит аннотацию Junit 4 @Before .

Мой подход к переходу с Junit 4 на Junit 5 заключается в удалении всего импорта, связанного с junit 4, прежде чем делать что-либо еще, т. Е. Удалить все операторы импорта в org.junit.* -packages .

Не сохраняйте ничего из этого:

 import org.junit.Before;
import org.junit.runner.RunWith;
import org.junit.Test;
  

Вместо этого импортируйте эти (и так далее):

 import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
  

Удаление старого импорта гарантирует, что не будет «забытого» импорта, который все еще висит, вызывая проблемы с, казалось бы, несвязанными сообщениями об ошибках, подобными тому, с которым вы столкнулись здесь .

Также обратитесь к руководству пользователя Junit 5, в частности к разделу аннотаций

Комментарии:

1. Спасибо за решение.

2. Большое вам спасибо, я использовал @RunWith(SpringJUnit4ClassRunner.class) и не мог получить доступ к контексту приложения, но с @ExtendWith(SpringExtension.class) помощью I can .