Spring 配置文件未正确应用于涉及 @Configurable 的测试
Spring profile not properly applied to tests involving @Configurable
我有一个非常奇怪的情况,已经在几个系统中发生过。我正在使用 Spring Boot 和 AspectJ CTW 来 @Autowired
某些实体中的依赖项(在容器外实例化)。
接收依赖项(抽象实体)的 class 有时会在不应用配置文件的情况下接收依赖项(在我的测试 class 中由 @ActiveProfile
配置)。它不是确定性的,因为通过改变测试的执行方式,可能会发生不同的输出。用代码来说明情况:
实体
@Configurable
public class AbstractMongoDocument<T> implements Persistable<T> {
@Transient
private transient MongoTemplate mongoTemplate;
//entity stuff
}
失败的测试之一
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = LOVApplication.class)
@ActiveProfiles("local-test")
public class MyCrazyIntegrationTest {
@Test
public void filterByFieldsFullMatchShouldReturnResult() throws Exception {
//Given
Location l1 = new Location("name","code",new GeoJsonPoint(11,10));
l1.save(); //Hence the need of autowiring there.
//When: whatever
//Then: Some assertions
}
}
这里有一些我觉得非常令人不安的事实:
- 依赖总是被注入,但有时它显然来自具有默认配置文件的 AppCtx.
- 如果 1 个 class 中的 1 个测试失败,它对那个特定 class 中的所有测试表现相同。
- 它可能发生也可能不发生取决于你如何执行 class(目前只有当我 运行 所有测试时它才会失败,但如果我 运行 class 单独来看,它在 maven 中的行为也不同。
- 如果我调试它,我可以看到注入的依赖项没有获得正确的配置文件。 (我发现通过注入
ApplicationContext
并令人惊讶地发现它与我在测试中收到的对象不同)。
- 最让我担心的是,现在我不确定这种情况是否也会发生在非测试环境中,例如生产配置文件,这意味着灾难。
我试图在 Jira 中寻找未解决的错误,但一无所获,所以我不会放弃我配置错误的东西。非常感谢任何帮助或想法。
您遇到的行为通常不会发生在生产部署中;然而,它是集成测试套件的一个已知问题,该套件利用@Configurable
和AspectJ加载时编织加载多个ApplicationContexts
。
有关详细信息,请参阅 Spring 的问题跟踪器中的以下问题:
我有一个非常奇怪的情况,已经在几个系统中发生过。我正在使用 Spring Boot 和 AspectJ CTW 来 @Autowired
某些实体中的依赖项(在容器外实例化)。
接收依赖项(抽象实体)的 class 有时会在不应用配置文件的情况下接收依赖项(在我的测试 class 中由 @ActiveProfile
配置)。它不是确定性的,因为通过改变测试的执行方式,可能会发生不同的输出。用代码来说明情况:
实体
@Configurable
public class AbstractMongoDocument<T> implements Persistable<T> {
@Transient
private transient MongoTemplate mongoTemplate;
//entity stuff
}
失败的测试之一
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = LOVApplication.class)
@ActiveProfiles("local-test")
public class MyCrazyIntegrationTest {
@Test
public void filterByFieldsFullMatchShouldReturnResult() throws Exception {
//Given
Location l1 = new Location("name","code",new GeoJsonPoint(11,10));
l1.save(); //Hence the need of autowiring there.
//When: whatever
//Then: Some assertions
}
}
这里有一些我觉得非常令人不安的事实:
- 依赖总是被注入,但有时它显然来自具有默认配置文件的 AppCtx.
- 如果 1 个 class 中的 1 个测试失败,它对那个特定 class 中的所有测试表现相同。
- 它可能发生也可能不发生取决于你如何执行 class(目前只有当我 运行 所有测试时它才会失败,但如果我 运行 class 单独来看,它在 maven 中的行为也不同。
- 如果我调试它,我可以看到注入的依赖项没有获得正确的配置文件。 (我发现通过注入
ApplicationContext
并令人惊讶地发现它与我在测试中收到的对象不同)。 - 最让我担心的是,现在我不确定这种情况是否也会发生在非测试环境中,例如生产配置文件,这意味着灾难。
我试图在 Jira 中寻找未解决的错误,但一无所获,所以我不会放弃我配置错误的东西。非常感谢任何帮助或想法。
您遇到的行为通常不会发生在生产部署中;然而,它是集成测试套件的一个已知问题,该套件利用@Configurable
和AspectJ加载时编织加载多个ApplicationContexts
。
有关详细信息,请参阅 Spring 的问题跟踪器中的以下问题: