如何为 Micronaut API 编写集成测试?
How to write integration tests for Micronaut APIs?
假设我有一个 API 来获取用户列表。控制器 -> 服务 -> 存储库。
来自 Spring 背景,为此 API 编写测试,在测试中,我们可以使用 @Autowired 声明存储库并使用此存储库插入用户数据(在数据设置部分)。然后进行 API 调用,然后断言响应。
如何在 Micronaut 中执行此操作?
您可以使用官方 Micronaut Test 模块在 Micronaut 中以类似的方式实施集成测试。
假设您使用的是 JUnit 5,这里有一个 code sample from the Micronaut Test documentation page。 (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
);
}
}
@MicronautTest
注释指示测试 运行ner 启动 Micronaut 应用程序以进行测试。然后 @Inject
注释注入 MathService
bean(类似于 @Autowired
注释。)现在由您来调用注入的服务以在您 运行 之前初始化所需的状态你的断言。
此外,请查看此 test example from the official "Access a database with JPA and Hibernate" 用户指南。它展示了如何使用声明性 HTTP 客户端(作为 @Inject @Client("/") HttpClient client
注入的客户端)针对以 @MicronautTest
注释启动的应用程序测试您的端点。您可以从这两种风格中受益。例如,您可以注入服务(或存储库)并调用它来为集成测试准备所需的初始状态,或者您可以通过调用特定的端点(如果存在)来创建您要从中检索的数据具有真正 REST API 调用的控制器。
更新:正如下面评论中提到的 Sascha Frinken,@MicronautTest
默认情况下将测试执行与事务包装在一起。在这种情况下,当您在测试方法中调用 repository.save(t)
方法时,在事务完成之前它不会被提交。您可以使用以下方式关闭此行为:
@MicronautTest(transactional = false)
似乎我们没有一段代码可以帮助我们告诉您您的问题可能出在哪里,提供可靠的解决方案有点复杂,即使我认为这可以帮助您。
每次你 运行 在 micronaut 应用程序上进行测试时,如果你想测试 controller > service[=23=,你将在你的上下文中获得服务和存储库] 正确通信你可以创建一个 @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
}
}
您可以在我的存储库中查看更多示例 a link!
假设我有一个 API 来获取用户列表。控制器 -> 服务 -> 存储库。 来自 Spring 背景,为此 API 编写测试,在测试中,我们可以使用 @Autowired 声明存储库并使用此存储库插入用户数据(在数据设置部分)。然后进行 API 调用,然后断言响应。 如何在 Micronaut 中执行此操作?
您可以使用官方 Micronaut Test 模块在 Micronaut 中以类似的方式实施集成测试。
假设您使用的是 JUnit 5,这里有一个 code sample from the Micronaut Test documentation page。 (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
);
}
}
@MicronautTest
注释指示测试 运行ner 启动 Micronaut 应用程序以进行测试。然后 @Inject
注释注入 MathService
bean(类似于 @Autowired
注释。)现在由您来调用注入的服务以在您 运行 之前初始化所需的状态你的断言。
此外,请查看此 test example from the official "Access a database with JPA and Hibernate" 用户指南。它展示了如何使用声明性 HTTP 客户端(作为 @Inject @Client("/") HttpClient client
注入的客户端)针对以 @MicronautTest
注释启动的应用程序测试您的端点。您可以从这两种风格中受益。例如,您可以注入服务(或存储库)并调用它来为集成测试准备所需的初始状态,或者您可以通过调用特定的端点(如果存在)来创建您要从中检索的数据具有真正 REST API 调用的控制器。
更新:正如下面评论中提到的 Sascha Frinken,@MicronautTest
默认情况下将测试执行与事务包装在一起。在这种情况下,当您在测试方法中调用 repository.save(t)
方法时,在事务完成之前它不会被提交。您可以使用以下方式关闭此行为:
@MicronautTest(transactional = false)
似乎我们没有一段代码可以帮助我们告诉您您的问题可能出在哪里,提供可靠的解决方案有点复杂,即使我认为这可以帮助您。
每次你 运行 在 micronaut 应用程序上进行测试时,如果你想测试 controller > service[=23=,你将在你的上下文中获得服务和存储库] 正确通信你可以创建一个 @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
}
}
您可以在我的存储库中查看更多示例 a link!