无法在 Spring 启动单元测试 运行 @ExtendWith(SpringExtension.class) 中注入应用程序上下文
could not inject application context in Spring Boot Unit test running with @ExtendWith(SpringExtension.class)
我正在尝试为使用 Spring 引导编写的 SOAP 端点编写单元测试。最初我使用 @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
不确定这里缺少什么。
请帮忙。
通常在迁移到 junit 5 期间出现此类错误是因为使用了 junit 4 包中的 Junit 注释。您提供的测试 class 包含 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 user guide, specifically the annotations section
我正在尝试为使用 Spring 引导编写的 SOAP 端点编写单元测试。最初我使用 @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
不确定这里缺少什么。
请帮忙。
通常在迁移到 junit 5 期间出现此类错误是因为使用了 junit 4 包中的 Junit 注释。您提供的测试 class 包含 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 user guide, specifically the annotations section