@MicronautTest 和 EmbeddedServer 有什么区别

What is difference between @MicronautTest and EmbeddedServer

使用 MicronautTestEmbeddedServer 启动服务器与在 Micronaut 框架的 Unit/Integration 测试中使用它们有什么区别。

选项A:

@MicronautTest
public class Test{

    @Inject
    EmbeddedServer server;
}

选项 B:

EmbeddedServer embeddedServer = ApplicationContext.run(EmbeddedServer.class);

选项 A 和 B 的区别在于您使用的 Micronaut 版本。

选项 B 用于 Micronaut 1.0 的早期阶段,当时 module micronaut-test 尚不可用。所以选项 B 是在没有 micronaut-test 支持的情况下编写集成测试。

EmbeddedServer embeddedServer = ApplicationContext.run(EmbeddedServer.class);

一段时间后(在 Micronaut 1.0.1 和 1.0.4 之间)OCI 引入了选项 A 模块 micronaut-test 使测试生活变得更加容易。它允许您编写 Spring 类似启动测试

@MicronautTest
public class Test extends Specification {

    @Inject
    EmbeddedServer server
}

我建议只使用选项 A,因为它是首选的测试方式,它使您可以使用 @Inject 任何 Micronaut bean,而无需直接使用 Micronaut 应用程序上下文。当使用 Spock 框架编写测试时,它还允许您动态地用 mocks 替换 Micronaut bean,如下例所示:

@MicronautTest
class MathMockServiceSpec extends Specification {

    @Inject
    MathService mathService 

    @Unroll
    void "should compute #num to #square"() {
        when:
        def result = mathService.compute(num)

        then:
        1 * mathService.compute(num) >> Math.pow(num, 2)  
        result == square

        where:
        num | square
        2   | 4
        3   | 9
    }

    @MockBean(MathServiceImpl) 
    MathService mathService() {
        Mock(MathService) 
    }
}

运行 ApplicationContext.run(EmbeddedServer.class) 将启动服务器(在测试或其他情况下)。 @MicronautTest 可以应用于测试,其结果是服务器将启动,除此之外,测试将受到依赖注入。一般来说,我会建议 @MicronautTest.

@MicronautTest 

提供注入依赖项的方法,例如(在 kotlin 中)

class MyTest(
@Client("/") client:HttpClient
@Inject val dataSource:DataSource){
// some tests
}

建议使用 MicronautTest

而不是手动创建它们