如何为 Micronaut API 编写集成测试?

Ami*_*B10 3 java micronaut micronaut-data

假设我有一个 API 来获取用户列表。控制器 -> 服务 -> 存储库。来自 Spring 背景,在这里为这个 API 编写测试,在测试中,我们可以使用 @Autowired 声明存储库并使用这个存储库插入用户数据(在数据设置部分)。然后进行该 API 调用,然后断言响应。如何在 Micronaut 中做到这一点?

Szy*_*iak 5

您可以使用官方Micronaut 测试模块在 Micronaut 中以类似方式实现集成测试。

假设您使用的是 JUnit 5,这里是来自 Micronaut 测试文档页面代码示例(Spock、KotlinTest 和 Kotest 有类似的示例,以防万一您使用不同的测试框架。)

package io.micronaut.test.junit5;

import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import javax.inject.Inject;

@MicronautTest 
class MathServiceTest {

    @Inject
    MathService mathService; 

    @ParameterizedTest
    @CsvSource({"2,8", "3,12"})
    void testComputeNumToSquare(Integer num, Integer square) {
        final Integer result = mathService.compute(num); 

        Assertions.assertEquals(
                square,
                result
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

@MicronuatTest注释指导测试运行启动用于测试目的的Micronaut应用。然后@Inject注解注入MathServicebean(与@Autowired注解类似)。现在由您来调用注入的服务以在运行断言之前初始化所需的状态。

另外,从官方“使用 JPA 和 Hibernate 访问数据库”用户指南中查看此测试示例。它展示了如何使用声明性 HTTP 客户端(注入为 的客户端)针对以注释启动的应用程序测试您的端点。您可以从这两种风格中受益。例如,您可以注入服务(或存储库)并调用它来为集成测试准备所需的初始状态,或者您可以通过调用可以创建要从中检索的数据的特定端点(如果存在)来做到这一点具有真正 REST API 调用的控制器。@Inject @Client("/") HttpClient client@MicronautTest

更新:正如Sascha Frinken在下面的评论中提到的,@MicronautTest默认情况下用事务包装测试执行。在这种情况下,当您repository.save(t)在测试方法中调用方法时,在事务完成之前它不会被提交。您可以通过以下方式关闭此行为:

@MicronautTest(transactional = false)
Run Code Online (Sandbox Code Playgroud)

  • @AmitB10 你在使用“@MicronatTest”吗?如果是这样,则通过设置“@MicronatTest(transactional = false)”来关闭事务 (2认同)