当前位置: 首页 > 知识库问答 >
问题:

Spring依赖项没有被注入到BeforeSuite方法中?

伍嘉
2023-03-14

我正在运行一个使用TestNG作为测试框架的Spring Boot应用程序。我的测试是这样设置的:

父类,负责设置逻辑并负责所有配置内容:

@ContextConfiguration(classes = {TestingConfig.class}, initializers = ConfigFileApplicationContextInitializer.class)
@ContextConfiguration(classes = TestConfig.class)
@TestPropertySource(locations = "classpath:application.yml")
public abstract ParentTestClass extends AbstractTestNGSpringContextTests {

    @Autowired
    private ServiceClient serviceClient;

    @BeforeSuite
    public void beforeClass() {

        Assert.assertNotNull(serviceClient);

        serviceClient.doSomeSetupWork();
    }
}

有多个子测试类。每个on继承父测试类,因此它们共享相同的设置逻辑。

public ChildTestClass1 extends ParentTestClass {

    @Test
    public void someTest() {
    ...
    }

    // More tests not shown
}

public ChildTestClass2 extends ParentTestClass {

    @Test
    public void anotherTest() {
    ...
    }

    // More tests not shown
}

问题是:以前我使用的是@beforeClass注释,这意味着父类的设置方法为每个子测试类运行一次。这是可以的,但等待相同的设置运行多次确实很慢。

所以我想:我将把ParentTestClass中的@beforeClass注释改为@beforeSuite!那会解决我所有的问题!

错了。

共有1个答案

钮巴英
2023-03-14

我相信这是按设计工作的。通过查看如何在org.springframework.test.context.testng.abstractTestNgSpringContextTests(您从其扩展)中构建实现,依赖项通过org.springframework.test.context.support.DependencyInjectionTestExecutionListener#InjectDependencies(这是一个侦听器)注入到测试类中。所有侦听器,包括DependencyInjectionTestExecutionListener只能通过org.springframework.test.context.testng.AbstractTestngSpringContextTests#SpringTestContextPrepareTestInstance调用,这是一个@beforeClass(Alwaysrun=true)分类的方法。

因此,除非这个@beforeClass注释方法运行完成,否则您的依赖项是不可用的。因此,您必须移出@beforeSuite方法,只使用@beforeClass注释。

如果您不需要多次执行服务设置,那么您需要在测试代码中添加一个编辑检查,该检查仅在未完成设置时执行设置。

 类似资料:
  • 我正在从事一个Spring项目,其中单元测试有自己的配置,称为UnitTestConfig,它有几个定义类似于主应用程序文件的bean(几乎是一个副本)。保持结构不变,我正在对主应用程序服务器代码进行一些更改,但是这会在UnitTestConfig中引发错误,因为它没有注入所需的bean。这些bean没有在单元测试中使用,有没有办法阻止UnitTestConfig尝试注入这些bean?这是一个巨大

  • 问题内容: 我想将依赖项注入。但是,我的方法不起作用。我可以看到Spring正在调用我的setter方法,但是稍后在调用when时,该属性为。 这是我的设置: ServletContextListener: web.xml :(这是文件中的最后一个侦听器) applicationContext.xml: 输出: 实现此目的的正确方法是什么? 问题答案: 我通过删除侦听器bean并为我的属性创建了一

  • 我想向Springbean注入一个单例对象依赖关系。问题是我无法访问和修改要注入其对象的类。让我描述一下这个例子。 所以我有我的接口,以及这个接口的实现,如下所示。 然后在我的配置类中,我正在创建一个bean,但是我需要在构造函数中向它传递对象,问题是我不能使成为bean,因为它来自外部包,我不能修改它。 所以我想做的是,能够将/autowire参数传递给bean。目前IntelliJ给我一个错误

  • 我正在使用spring官方教程中的示例进行实验,并且对此代码有一个依赖关系: https://github.com/spring-guides/gs-async-method/tree/master/complete 如果您查看类上的代码,我有两个问题: 当服务器启动时,如果我在这个类的构造函数中放置一个断点,就像在构造函数中一样,是由spring使用配置的bean提供的。但是,构造函数上没有注释

  • 我想从基于xml的Spring配置切换到基于java的配置。对于构造函数类型注入,这很容易。我正在使用的示例: 但是,当我想通过setter方法注入时,我是这样做的: 我不确定这是否是注入基于Java的配置和setter方法的可能方法。不幸的是,我找不到任何示例(对于构造函数依赖项,存在很多示例)。另外,我不确定在基于Java的配置的情况下,我应该何时使用构造函数,何时使用setter。在Spri

  • 问题内容: 我试图将Spring依赖项注入到JPA EntityListener中。这是我的侦听器类: 这是我的Entity类: 但是,我的依赖项(即)始终为null。 问题答案: 注入对无状态bean的依赖关系的一种方法是将依赖关系定义为“静态”,创建一个setter方法,以便Spring可以注入依赖关系(将其分配给静态依赖关系)。 将依赖项声明为静态。 创建一个方法,以便Spring可以注入它