假设我有一个api来获取用户列表。控制器->服务->存储库。来自spring后台,为了编写这个api的测试,在test中,我们可以用@autowired声明存储库,并使用这个存储库插入用户数据(在数据设置部分)。然后进行api调用,然后Assert响应。如何在micronaut中执行此操作?
nimxete21#
似乎我们没有一段代码可以帮助我们告诉你你的问题可能在哪里给出一个可靠的解决方案有点复杂,即使我认为这可以帮助你。每次在micronaut应用程序上运行测试时,都会在上下文中提供服务和存储库,如果要测试控制器>服务是否正确通信,可以创建 @Client 我给你举一个测试的例子 Spock Framework ```class PersonControllerSpec extends Specification {
@Client
Spock Framework
@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 }
}
你可以在我的存储库上看到更多的例子链接!
g9icjywg2#
您可以使用官方的micronaut测试模块以类似的方式在micronaut中实现集成测试。假设您使用的是JUnit5,下面是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 注解注入 MathService bean(类似于 @Autowired 现在,在运行Assert之前,由您调用注入的服务来初始化所需的状态。另外,从官方的“使用jpa和hibernate访问数据库”用户指南中查看这个测试示例。它展示了如何使用声明性http客户机(作为 @Inject @Client("/") HttpClient client )要针对从 @MicronautTest 注解。您可以从这两种样式中受益。例如,您可以注入服务(或存储库)并调用它来为集成测试准备所需的初始状态,或者您也可以通过调用特定的端点(如果存在的话)来做到这一点,这些端点可以创建您想要通过真正的restapi调用从控制器检索的数据。更新:正如sascha frinken在下面的评论中提到的, @MicronautTest 默认情况下,用事务 Package 测试执行。在这种情况下,当你打电话 repository.save(t) 方法中,它在事务完成之前不会被提交。您可以通过以下方式关闭此行为:
@MicronuatTest
@Inject
MathService
@Autowired
@Inject @Client("/") HttpClient client
@MicronautTest
repository.save(t)
@MicronautTest(transactional = false)
2条答案
按热度按时间nimxete21#
似乎我们没有一段代码可以帮助我们告诉你你的问题可能在哪里给出一个可靠的解决方案有点复杂,即使我认为这可以帮助你。
每次在micronaut应用程序上运行测试时,都会在上下文中提供服务和存储库,如果要测试控制器>服务是否正确通信,可以创建
@Client
我给你举一个测试的例子Spock Framework
```class PersonControllerSpec extends Specification {
}
g9icjywg2#
您可以使用官方的micronaut测试模块以类似的方式在micronaut中实现集成测试。
假设您使用的是JUnit5,下面是micronaut测试文档页面的代码示例(spock、kotlintest和kotest也有类似的例子,以防您使用不同的测试框架。)
这个
@MicronuatTest
注解指示测试运行程序为测试目的启动micronaut应用程序。然后@Inject
注解注入MathService
bean(类似于@Autowired
现在,在运行Assert之前,由您调用注入的服务来初始化所需的状态。另外,从官方的“使用jpa和hibernate访问数据库”用户指南中查看这个测试示例。它展示了如何使用声明性http客户机(作为
@Inject @Client("/") HttpClient client
)要针对从@MicronautTest
注解。您可以从这两种样式中受益。例如,您可以注入服务(或存储库)并调用它来为集成测试准备所需的初始状态,或者您也可以通过调用特定的端点(如果存在的话)来做到这一点,这些端点可以创建您想要通过真正的restapi调用从控制器检索的数据。更新:正如sascha frinken在下面的评论中提到的,
@MicronautTest
默认情况下,用事务 Package 测试执行。在这种情况下,当你打电话repository.save(t)
方法中,它在事务完成之前不会被提交。您可以通过以下方式关闭此行为: