首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@微自动测试-限制实例化的内容

@微自动测试-限制实例化的内容
EN

Stack Overflow用户
提问于 2021-05-07 09:15:36
回答 1查看 474关注 0票数 0

每当我在我的项目中使用@MicronautTest时,整个应用程序都会作为一个整体启动,而且由于某些事情需要在服务启动时完成,所以它们也会被执行。当我测试一个简单的控制器时,我不需要整个Singleton shebang。

我的问题是,在测试Micronaut时,如何限制加载哪些控制器和单机?

我有一个演示示例,它显示了这个问题。

Pom.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>micronaut-test</artifactId>
    <version>0.1</version>
    <packaging>${packaging}</packaging>

    <parent>
        <groupId>io.micronaut</groupId>
        <artifactId>micronaut-parent</artifactId>
        <version>2.5.1</version>
    </parent>

    <properties>
        <packaging>jar</packaging>
        <jdk.version>11</jdk.version>
        <release.version>11</release.version>
        <micronaut.version>2.5.1</micronaut.version>
        <exec.mainClass>com.example.Application</exec.mainClass>
        <micronaut.runtime>netty</micronaut.runtime>
    </properties>

    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo.maven.apache.org/maven2</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-inject</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-validation</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut.test</groupId>
            <artifactId>micronaut-test-junit5</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-client</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-server-netty</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-runtime</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>io.micronaut.build</groupId>
                <artifactId>micronaut-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <!-- Uncomment to enable incremental compilation -->
                    <!-- <useIncrementalCompilation>false</useIncrementalCompilation> -->

                    <annotationProcessorPaths combine.children="append">
                    </annotationProcessorPaths>
                    <compilerArgs>
                        <arg>-Amicronaut.processing.group=com.example</arg>
                        <arg>-Amicronaut.processing.module=micronaut-test</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.java

代码语言:javascript
复制
package com.example;

import io.micronaut.runtime.Micronaut;

public class Application {

    public static void main(String[] args) {
        Micronaut.run(Application.class, args);
    }
}

一种简单的服务,每当实例化它就会抛出以指示问题。

代码语言:javascript
复制
@Singleton
public class SingletonService {

    @EventListener
    public void init(ApplicationStartupEvent event) {
        throw new RuntimeException("I was initialized");
    }
}

一个简单的控制器

代码语言:javascript
复制
@Controller
public class TestController {

    @Get
    public Simple findAll() {
        return new Simple("ATest");
    }

    public static class Simple {
        private final String test;

        public Simple(String test) {
            this.test = test;
        }

        public String getTest() {
            return test;
        }
    }
}

和一个简单的测试

代码语言:javascript
复制
@MicronautTest
class TestControllerTest {
    @Inject
    @Client("/")
    RxHttpClient rxHttpClient;

    @Test
    void controller() {
        HttpResponse<ByteBuffer> byteBufferHttpResponse = rxHttpClient.exchange("/").blockingFirst();
        assert byteBufferHttpResponse.getStatus().getCode() == 200;
    }
}

测试结果如下

代码语言:javascript
复制
[INFO] Running com.example.controller.TestControllerTest
11:01:52.804 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [test]
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 7.232 s <<< FAILURE! - in com.example.controller.TestControllerTest
[ERROR] com.example.controller.TestControllerTest  Time elapsed: 7.229 s  <<< ERROR!
java.lang.RuntimeException: I was initialized

如何防止测试启动SingletonService?固执是一种选择,但请记住,这是一个简单的演示,说明了一个更大的项目的问题。有没有其他直截了当的办法?根据@MicronautTest的文档,它不应该扫描类路径,但它显然是?

下面是一些我已经尝试过但没有成功的其他配置:

添加禁用ApplicationBuilder的eagerInit

代码语言:javascript
复制
@MicronautTest(application = TestControllerTest.TestApplication.class)
class TestControllerTest {
    public static class TestApplication {
        public static void main(String[] args) {
            Micronaut.build(args)
                    .eagerInitAnnotated(null)
                    .eagerInitSingletons(false)
                    .mainClass(TestApplication.class);
        }
    }
    @Inject
    @Client("/")
    RxHttpClient rxHttpClient;

    @Test
    void controller() {
        HttpResponse<ByteBuffer> byteBufferHttpResponse = rxHttpClient.exchange("/").blockingFirst();
        assert byteBufferHttpResponse.getStatus().getCode() == 200;
    }
}

传递一个contextbuilder

代码语言:javascript
复制
@MicronautTest(contextBuilder = TestControllerTest.TestContextBuilder.class)
class TestControllerTest {

    public static class TestContextBuilder extends DefaultApplicationContextBuilder {
        public TestContextBuilder() {
            eagerInitSingletons(false);
            eagerInitAnnotated(null);
            eagerInitConfiguration(false);
        }
    }

    @Inject
    @Client("/")
    RxHttpClient rxHttpClient;

    @Test
    void controller() {
        HttpResponse<ByteBuffer> byteBufferHttpResponse = rxHttpClient.exchange("/").blockingFirst();
        assert byteBufferHttpResponse.getStatus().getCode() == 200;
    }
}

结果都是一样的。

希望有人知道如何使用@MicronautTest限制bean实例化的范围,否则我很可能会切换回Spring

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-07 09:50:09

我的问题是,在测试Micronaut时,如何限制加载哪些控制器和单机?

至少有一个@Requires注释,允许在当前环境中加载bean时执行灵活的配置。

例如,在您的例子中,应该是这样的:

代码语言:javascript
复制
import javax.inject.Singleton;
import io.micronaut.context.annotation.Requires;

@Singleton
@Requires(notEnv = {Environment.TEST})
public class SingletonService {

    @EventListener
    public void init(ApplicationStartupEvent event) {
        throw new RuntimeException("I was initialized");
    }
}

因此,不会引发来自服务的异常。

但是,我真的不知道为什么您需要排除该服务。其他方法也可能更方便。

例如,请参阅micronaut测试文档中的Mocking Collaborators部分:https://micronaut-projects.github.io/micronaut-test/latest/guide/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67432149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档