java - Spring 配置文件未正确应用于涉及 @Configurable 的测试

标签 java spring spring-boot aspectj spring-test

我遇到了一个非常奇怪的情况,这种情况已经在多个系统中发生过。我正在使用 Spring Boot 和 AspectJ CTW 来某些实体中的 @Autowired 依赖项(在容器外部实例化)。

接收依赖项的类(抽象实体)有时会在不应用配置文件的情况下接收依赖项(在我的测试类中由 @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. 依赖项始终会被注入(inject),但有时它显然来自具有默认配置文件的 AppCtx
  2. 如果 1 个类中的 1 个测试失败,则该特定类中的所有测试的行为都是相同的。
  3. 它可能会也可能不会发生,具体取决于您执行该类的方式(目前,仅当我运行所有测试时才会失败,但如果我单独运行该类,它就会成功,它在 Maven 中的行为也有所不同)。<
  4. 如果我调试它,我可以看到注入(inject)的依赖项没有获得正确的配置文件。 (我发现通过注入(inject) ApplicationContext 并令人惊讶地发现它是一个与我在测试中收到的对象不同的对象)。
  5. 最让我担心的是,现在我不确定这种情况是否也会发生在具有生产配置文件的非测试环境中,这将意味着一场灾难。

我尝试在 Jira 中寻找 Unresolved 错误,但什么也没发现,所以我不会放弃我配置错误的东西。任何帮助或想法将不胜感激。

最佳答案

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

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

关于java - Spring 配置文件未正确应用于涉及 @Configurable 的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32097228/

相关文章:

java - 通过一次操作下载 S3 对象

java - Apache 运行 java web 应用程序时出错

java - Wicket 口 6 中的异常处理进入反馈面板

java - 我应该有一个单例 ThreadPoolTask​​Executor 来共享不同的服务吗?

spring-security - Spring Security OAuth2 SSO 与自定义提供程序 + 注销

java - 我们可以使用 swagger-generator 在模型变量上生成 @JsonFormat 吗?

java - Eureka认证方法及UI

java - Oracle Web 服务日期在 Java 代码中返回 Null,但在 SOAP UI 中不返回 Null

java - Spring Java 微服务 war 规模过大

java - hibernate hbm : automatic (unwanted) update found