【发布时间】:2021-02-11 21:45:41
【问题描述】:
我正在阅读有关 Spring test 的 Spring 文档:here
关于在测试中使用@Transactinoal,它说:
如果你的测试是@Transactional,它默认在每个测试方法结束时回滚事务。但是,由于将这种安排与 RANDOM_PORT 或 DEFINED_PORT 一起使用隐式提供了一个真正的 servlet 环境,HTTP 客户端和服务器在单独的线程中运行,因此在单独的事务中运行。在这种情况下,服务器上发起的任何事务都不会回滚。
我不明白在这种情况下在服务器上启动的任何事务都不会回滚。
感谢任何帮助。
【问题讨论】:
-
一个事务只能在本地工作。如果您正在运行一个集成测试,那么您实际上是在发出一个 HTTP 请求,一个 HTTP 请求不是事务性的。
-
你不能直接使用
WebEnvironment.DEFINED_PORT或WebEnvironment.RANDOM_PORT,或者使用dirties contexts。 -
@Vincent C. 感谢您的回复。如果您使用此评论更新您的答案,我将不胜感激。使用
DirtiesContext会导致再次加载ApplicationContext 以进行下一个测试,即timeConsuming。在这种情况下,使用WebEnvironment.NONE/MOCK似乎是您提到的更好的选择。使用 NONE 或 MOCK 是否会遗漏任何内容。我知道应用程序不会在容器中运行,但它真的很痛苦吗? -
我认为您需要使用这两个选项之一。如果你不这样做,你很可能只需要
WebEnvironment.MOCK(无论如何这是默认的,所以你可以简单地使用@SpringBootTest而不带任何参数)。
标签: java spring-transactions spring-test