【问题标题】:How to enable eager singleton initialization for tests in Micronaut?如何为 Micronaut 中的测试启用急切的单例初始化?
【发布时间】:2021-02-08 10:32:36
【问题描述】:

我有一个案例,我有一个 @Factory 带注释的类,它创建一个 bean 并调用一些代码。我启用了急切的单例初始化和 即使在应用程序启动时没有在任何地方使用 bean 工厂方法,它也会被调用。但是对于测试,急切的初始化不起作用并且没有创建 bean:

应用:

public class Application {

    public static void main(String[] args) {
        Micronaut.build(args)
                .eagerInitSingletons(true)
                .mainClass(Application.class)
                .start();
    }
}

配置

@Factory
public class Config {

    @Singleton
    @Bean
    public Response response() {
        System.out.println("Invoked");
        //invoking some code
        return new Response("test");
    }
}

和测试:

@MicronautTest(application = Application.class)
class ApplicationSpec extends Specification {

    @Inject
    EmbeddedApplication<?> application

    void 'test it works'() {
        expect:
        application.running
    }

}

所以在执行测试时,即使启用了eagerInitSingletons,也不会调用来自Config 类的response 方法,并且它在应用程序正常启动时起作用。

问题是:如何为 micronaut 测试启用急切的单例初始化?

【问题讨论】:

    标签: java micronaut


    【解决方案1】:

    您可以尝试使用自定义上下文构建器吗?

    你的测试类

    @MicronautTest(contextBuilder = CustomContextBuilder.class)
    

    您的 CustomContextBuilder:

    public class CustomContextBuilder extends DefaultApplicationContextBuilder {
    
        public CustomContextBuilder() {
            eagerInitSingletons(true);
        }
    }
    

    【讨论】:

    • 我之前已经采用了这种方法,但是它使我的一些测试失败,因为它覆盖了DefaultHttpClient,并且由于uri 未指定问题而导致测试失败。如果没有其他回答者,可能会接受这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多