当前位置: 首页 > 知识库问答 >
问题:

@Micronauttest-限制实例化的内容

阎德业
2023-03-14

每当我在项目中使用@micronauttest时,整个html" target="_blank">应用程序都是作为一个整体启动的,因为某些事情需要由服务在启动时完成,所以它们也会被执行。当我测试一个简单的控制器时,我不需要整个单一的shebang。

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

我有一个小的演示示例来说明这个问题

pom.xml

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

package com.example;

import io.micronaut.runtime.Micronaut;

public class Application {

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

@Singleton
public class SingletonService {

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

一种简单的控制器

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

和一个简单的测试

@MicronautTest
class TestControllerTest {
    @Inject
    @Client("/")
    RxHttpClient rxHttpClient;

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

测试结果为

[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?Stubing是一种选择,但请记住,这是一个简单的演示,说明了一个更大的项目的问题。就没有其他直截了当的方法了吗?根据@Micronauttest的文档,它不应该扫描类路径,但它显然是扫描的?

@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;
    }
}
@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 boot

提前致谢

共有1个答案

司马念
2023-03-14

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

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

例如,在您的情况下,它应该类似于:

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/

 类似资料:
  • 有内在的 科特林拥有的: Java如何解决这个问题:

  • 问题内容: 我有一个实用程序方法,当从中删除了不相关的逻辑时,简化的方法将如下所示: 问题是,如果是诸如的内部类,则该方法即使是公共方法也将不起作用,因为它将抛出。 有没有办法动态实例化内部类? 问题答案: 如果它是真正的 内部 类而不是 嵌套 (静态)类,则有一个隐式构造函数参数,它是对外部类实例的引用。在那个阶段您不能使用- 必须获得适当的构造函数。这是一个例子:

  • 本文向大家介绍unity3d 实例化预制件,包括了unity3d 实例化预制件的使用技巧和注意事项,需要的朋友参考一下 示例 有两种实例化预制件的方法:在设计时或运行时。 设计时间实例化 在设计时实例化预制件对于在视觉上放置同一对象的多个实例很有用(例如,在设计游戏关卡时放置树)。 要以视觉方式实例化预制件,请将其从项目视图拖到场景层次中。 如果要编写编辑器扩展,还可以实例化以编程方式调用的预制方

  • pm2 cluster模式下max_memory_restart是所有实例的总内存还是单个实例的内存限制?

  • 我很好奇如何处理GAE中的内存限制。目前,我有这个应用程序,需要大量的CPU/内存。 我尝试在GAE上使用b8实例运行它(基本上是使用4.8GHz CPU的顶级实例) 我还尝试手动设置CPU的数量 但无论我做什么,我总是达到同样的记忆限制。。。(见下文) GET500 0 B 43 s Unknown/_ah/start在总共处理0个请求后,超过了2048 MB的软内存限制,达到3163 MB。考

  • 问题内容: 我有只希望从中创建一个实例的模型,不应再允许更多实例。 这可能吗?我有感觉到已经在某处完成了此操作,但是很遗憾,我无法找到它。 编辑:我需要一个愚蠢的简单CMS。我有一个FrontPage和Page类继承的抽象类。我只希望能够创建一个首页对象。 FrontPage对象和Page对象之间的区别在于,它们应该具有略有不同的字段和模板,并且如上所述,只能创建一个FrontPage。 问题答案