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

使用TestExecutionListener时,Spring测试注入不起作用

冯卓
2023-03-14

我想使用自定义的<code>TestExecutionListener</code>和<code>SpringJUnit4ClassRunner</code>结合使用,在我的测试数据库上运行Liquibase模式设置。我的<code>TestExecutionListener</code>工作正常,但当我在类上使用注释时,测试中DAO的注入不再工作,至少实例为空。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext-test.xml" })
@TestExecutionListeners({ LiquibaseTestExecutionListener.class })
@LiquibaseChangeSet(changeSetLocations={"liquibase/v001/createTables.xml"})
public class DeviceDAOTest {

    ...

    @Inject
    DeviceDAO deviceDAO;

    @Test
    public void findByCategory_categoryHasSubCategories_returnsAllDescendantsDevices() {
        List<Device> devices = deviceDAO.findByCategory(1); // deviceDAO null -> NPE
        ...
    }
}

侦听器相当简单:

public class LiquibaseTestExecutionListener extends AbstractTestExecutionListener {

    @Override
    public void beforeTestClass(TestContext testContext) throws Exception {
        final LiquibaseChangeSet annotation = AnnotationUtils.findAnnotation(testContext.getTestClass(),
                LiquibaseChangeSet.class);
        if (annotation != null) {
            executeChangesets(testContext, annotation.changeSetLocations());
        }
    }

    private void executeChangesets(TestContext testContext, String[] changeSetLocation) throws SQLException,
            LiquibaseException {
        for (String location : changeSetLocation) {
            DataSource datasource = testContext.getApplicationContext().getBean(DataSource.class);
            DatabaseConnection database = new JdbcConnection(datasource.getConnection());
            Liquibase liquibase = new Liquibase(location, new FileSystemResourceAccessor(), database);
            liquibase.update(null);
        }
    }

}

日志中没有错误,在我的测试中只有一个 NullPointerException。我不明白使用我的TestExecutionListener如何影响自动接线或注入。

共有2个答案

郎灿
2023-03-14

我建议考虑这样做:

@TestExecutionListeners(
        mergeMode =TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS,
        listeners = {MySuperfancyListener.class}
)

这样您就不需要知道需要哪些侦听器。我推荐这种方法,因为SpringBoot花了几分钟试图通过使用DependencyInjectionTestExecutionListener.class使其正常工作。

包和泰
2023-03-14

我看了一下Spring的DEBUG日志,发现当我省略我自己的TestEx,侦听器时,Spring设置了一个依赖项。当用@TestEx,执行,侦听器注释测试时,侦听器会被覆盖。

因此,我只是在自定义的DependencyInjectionTestExecutionListener中显式添加了Dependency,一切都很好:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext-test.xml" })
@TestExecutionListeners(listeners = { LiquibaseTestExecutionListener.class,
    DependencyInjectionTestExecutionListener.class })
@LiquibaseChangeSet(changeSetLocations = { "liquibase/v001/createTables.xml" })
public class DeviceDAOTest {
    ...

更新:此处记录了该行为。

...或者,可以通过显式配置类@TestExecutionListeners并从侦听器列表中省略 DependencyInjectionTestExecutionListener.class来完全禁用依赖关系注入。

 类似资料:
  • 我想在测试中注入DeMorgenArticleScraper。 DeMorgenArticleScraper组件本身进行了一些配置,但IDE/编译器并没有抱怨它们。 用@Qualifier注释的构造函数参数在Config.class中使用@Bean定义。类本身有@Configuration。我想问题不在这里。 IDE已经警告我,找不到bean。。。必须在bean中定义自动连线成员。但据我所知,它是

  • 我开始开发一个经典的Spring Boot MVC应用程序。我使用依赖注入(使用、注释)没有任何问题。 当我尝试使用依赖注入运行某些集成测试时,我会以相同的方式从JUnit得到以下错误消息: 在包中,我有一个没有注释的接口和一个用注释的类。 我不明白,如果DI可以运行我的应用程序,那么为什么它在测试中不起作用。不知何故,我的注释实现类没有被spring boot发现,就像错误消息所说的那样。 测试

  • 我正试图为一个java spring项目编写一个集成测试。在代码中的某个时候,我需要检查客户。getId(),其中ID由如下注释创建:(请记住,Customer\u ID是我的自动递增主键) 我使用lombok生成getter和setter方法。我的测试数据库是H2,我使用Junit5进行测试。我面临的问题是,我无法测试getId()行为,因为当我用DataJpaTest注释测试时,它总是0。我使

  • 当我在spring aop拦截类上使用注释时,我使用了@target limit匹配方法。但调试时,会提示以下错误。 我的切入点是这样的 其中TimeIt是注释: 我把切点改成能跑了 我不太理解的是,MetricsFilter 类没有这个注释,那么为什么要生成代理呢?任何人都可以帮我吗?谢谢。

  • 问题内容: 如何将Spring依赖注入到我编写的扩展AbstractTestExecutionListener的TestExecutionListener类中? Spring DI似乎不适用于TestExecutionListener类。问题示例: AbstractTestExecutionListener: 配置文件: JUnit测试文件: 如代码注释中突出显示的那样,当我运行此代码时,它将打印

  • 并添加注释 我得到一条消息:没有测试找到test runner JUnit5,并且在Problems选项卡中有SpringBootTest.jar无法读取或者不是有效的ZIP文件 也试过 我也试过: 如果我将字符串myUrl硬编码为“http://localhost:8090”,则测试工作正常,因此问题在于@value不工作