首页 > 解决方案 > 管道中不尊重 Micronaut @Requires 注释

问题描述

我已经构建了一个 Micronaut 应用程序,到目前为止还没有任何 CI 管道。所有构建都可以在所有开发人员计算机上完美运行,但我一生都无法让它在管道中运行。

问题是我有一个用 注释的服务@Context,这意味着我希望它在应用程序启动时启动:

@Context
@Requires(property = "broker.subscribe.exchanges", env = { "k8s", "local" })
@ExecuteOn(TaskExecutors.MESSAGE_CONSUMER)
public class SubscriberService {

    private final BrokerSubscriber subscriber;

    public SubscriberService(final BrokerSubscriber subscriber) {
        this.subscriber = subscriber;
    }
}

这只是开始订阅许多交易所。我已添加env到注释中以确保在运行测试时这些不会启动。如果我env从注释中删除该属性,我会得到一个失败的测试。

在管道中运行的代码在env注解上设置了属性,但它不受尊重。当我在管道中运行时,在没有本地设置属性./gradlew clean test的情况下失败的完全相同的测试失败。env

有问题的测试测试一个配置对象,并且没有用 注释@MicronautTest,但是它确实开始了ApplicationContext

class BrokerConfigurationTest {

    private ApplicationContext ctx;

    @BeforeEach
    void setUp() {
        final Map<String, Object> items = new HashMap<>();
        items.put(getKey("server.host"), HOST);
        items.put(getKey("server.port"), PORT);
        items.put(getKey("server.password"), PASSWORD);
        items.put(getKey("server.user"), USER);
        items.put(getKey("subscribe.exchanges"), Set.of(EXCHANGE));

        // Explicitly not loading anything else.
        ctx = ApplicationContext.builder().packages(BrokerConfigurationTest.class.getPackageName()).properties(items).start();
        // Same result:
        // ctx = ApplicationContext.builder().environments("asdf").properties(items).start();
        // Same result:
        // ctx = ApplicationContext.run(items);
    }
}

实际上起作用的是删除以下行:

items.put(getKey("subscribe.exchanges"), Set.of(EXCHANGE));

这意味着@Requires注释在以下方面未得到满足property

@Requires(property = "broker.subscribe.exchanges", env = { "k8s", "local" })

使用此设置,我什至可以删除env注释中的属性并且它可以工作。但我需要测试这个属性的行为,所以这不是解决方案。

我尝试过的不起作用:

  1. 禁用环境扣除./gradlew -Dmicronaut.env.deduction=false clean test
  2. 在管道构建中添加环境变量集,并添加MICRONAUT_ENVIRONMENTS-annotation 。cinotEnv = { "ci" }Requires
  3. 上述两者同时
  4. 明确告诉失败的测试不要扫描他们自己的包之外的任何东西
  5. 将环境显式设置为测试设置以外k8s的其他local设置。

到目前为止,该框架的体验超级流畅,但这让我摸不着头脑。任何关于这里可能出现的问题的意见将不胜感激。

标签: javacontinuous-integrationmicronaut

解决方案


推荐阅读