【问题标题】:Why is Spring @Autowired ApplicationContext null in integration test?为什么集成测试中的 Spring @Autowired ApplicationContext 为空?
【发布时间】:2020-08-05 16:18:37
【问题描述】:

我还是 Spring 的新手,并且在堆栈上查看了类似的问题,但无法从我所阅读的内容中找到答案。

当我调用我的 applicationContext 变量时收到 NPE,这意味着 bean 一定没有被正确创建或注入。这是我程序的相关部分。

@SpringBootTest
@ContextConfiguration(classes = TestConfig.class)
public class SampleIT {

    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void sampleMethod() throws Exception {

        //NPE below
        String[] allBeanNames = applicationContext.getBeanDefinitionNames();

        //more logic 

我试图让 ApplicationContext 实例调试为什么其他 bean 从我的配置中为空,所以这一切一定是因为我对 ApplicationContext 的设置方式和注入其中的 bean 的理解存在一个基本缺陷。非常感谢任何帮助!

【问题讨论】:

  • 您使用的是 JUnit 4 还是 5?
  • 使用 Junit 4.12 @chrylis-cautiouslyoptimistic-

标签: java spring


【解决方案1】:

尝试将以下注释添加到您的班级SampleIT

@RunWith(SpringRunner.class)

【讨论】:

  • 这在 JUnit 5 中不再需要,但如果 OP 使用的是 JUnit 4,它可能就是答案。
  • 好的,这似乎解决了空注入问题!谢谢!
【解决方案2】:

现在回答我自己的问题。导入 org.junit.jupiter.api.Test 而不是 org.junit.Test 将导致使用 Junit5。这将允许 Junit 在没有 @RunWith(SpringRunner.class) 注释的情况下使用 Spring。我正在使用的代码库中仍然存在 Junit4 的残余,所以这是在完全迁移到 Junit 5 之前的快速修复。

【讨论】:

    【解决方案3】:

    如果你在版本 4 中使用 Junit,你必须使用 @RunWith(SpringRunner.class), 如果您使用的是 Junit 版本 5,则必须使用 @ExtendWith(SpringExtension.class)。

    另外,如果您使用的是 Mockito,您可以使用 @ExtendWith(MockitoExtension.class) 等。

    我强烈建议阅读此链接中有关 @SpringBootTest 注释的文档 @SpringBootTest

    【讨论】:

    • 关于 Junit 5 的部分是不正确的。 @SpringBootTest 已经包含 @ExtendWith(value=org.springframework.test.context.junit.jupiter.SpringExtension.class)
    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多