我想使用自定义的<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
如何影响自动接线或注入。
我建议考虑这样做:
@TestExecutionListeners(
mergeMode =TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS,
listeners = {MySuperfancyListener.class}
)
这样您就不需要知道需要哪些侦听器。我推荐这种方法,因为SpringBoot花了几分钟试图通过使用DependencyInjectionTestExecutionListener.class
使其正常工作。
我看了一下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不工作