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
    }
}

这里有一些我觉得非常令人不安的事实:

  1. 依赖总是被注入,但有时它显然来自具有默认配置文件的 AppCtx.
  2. 如果 1 个 class 中的 1 个测试失败,它对那个特定 class 中的所有测试表现相同。
  3. 它可能发生也可能不发生取决于你如何执行 class(目前只有当我 运行 所有测试时它才会失败,但如果我 运行 class 单独来看,它在 maven 中的行为也不同。
  4. 如果我调试它,我可以看到注入的依赖项没有获得正确的配置文件。 (我发现通过注入 ApplicationContext 并令人惊讶地发现它与我在测试中收到的对象不同)。
  5. 最让我担心的是,现在我不确定这种情况是否也会发生在非测试环境中,例如生产配置文件,这意味着灾难。

我试图在 Jira 中寻找未解决的错误,但一无所获,所以我不会放弃我配置错误的东西。非常感谢任何帮助或想法。

您遇到的行为通常不会发生在生产部署中;然而,它集成测试套件的一个已知问题,该套件利用@Configurable和AspectJ加载时编织加载多个ApplicationContexts

有关详细信息,请参阅 Spring 的问题跟踪器中的以下问题: