3

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

4

2 回答 2

6

您可以使用官方的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
        );
    }
}

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

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

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

@MicronautTest(transactional = false)
于 2020-12-03T10:39:49.947 回答
1

似乎我们没有一段代码可以帮助我们告诉您您的问题可能出在哪里,给出一个可靠的解决方案有点复杂,即使我认为这可以帮助您。

每次在 micronaut 应用程序上运行测试时,您都可以在上下文中使用服务和存储库,如果您想测试您的控制器 > 服务是否正确通信,您可以创建一个@Client

我会给你一个测试的例子Spock Framework

class PersonControllerSpec extends Specification {

    @Shared @AutoCleanup EmbeddedServer embeddedServer = ApplicationContext.run(EmbeddedServer)
    @Shared PersonClient client
    @Shared PersonService service

    void setupSpec(){
        client = embeddedServer.applicationContext.getBean(PersonClient)
        service = embeddedServer.applicationContext.getBean(PersonService)
    }


    @Transactional
    void cleanup(){
        Person.list()*.delete()
    }

    def "/people should return 2 elements" (){
        given:
        service.save(new Person(name: "Daniel", lastName: "Araiza", age: 22, phone: "235-547-8761" ))
        service.save(new Person(name: "Omar", lastName: "Bautista", age: 32, phone: "765-234-8623"))
        when:
        List<Person> people = client.list()
        then:
        people.size() == 2
    }
}

您可以在我的存储库中查看更多示例链接

于 2020-12-03T15:02:20.237 回答