java - SpringBoot @interface 总结不同注解

标签 java spring-boot junit

我有一个自己的单元测试注释,看起来像

@Retention(RetentionPolicy.RUNTIME)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
@Transactional(rollbackFor = MyException.class)
public @interface DefaultTestAnnotations {
}

我的不同测试类的注释如下

@RunWith(SpringRunner.class)
// @SpringBootTest() <--------------(1)
@DefaultTestAnnotations
public class MyTest1 extends Basic4Tests {

当我单独运行 MyTest1 时,它成功了。如果我在更大的复合体中运行它,它会由于一些奇怪的数据库实体故障而失败。为了简洁起见,我跳过了细节。

当我取消注释 (1) 时,测试(无论是单独测试还是复合测试)都会成功。现在我认为注释 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 已经足够了。但显然不是。

有人有想法吗

  • @interface 声明可以概括什么?从某种意义上说,这些被使用并且是“有意义的”
  • 为什么我需要再次指定@SpringBootTest()?我认为在界面中声明就足够了。

更新:

“某些奇怪的数据库实体失败” - 意味着测试将数据保存到数据库中,并且在检索数据时无法正确恢复枚举。引发的异常表明检索到了一些似乎从未存储过的虚假数据。跟踪具体问题超出了这个问题的范围,因为我找到了一个解决方案 - 我理解。为了避免遇到类似的问题,我希望更清楚地了解如何使用 @interface

最佳答案

我猜您在一次测试中操作了数据库中的数据,因此下一个测试没有您假设的数据。出于性能原因,Spring 在测试之间重用应用程序上下文,并且不会重置它。

解决办法有两种: - 在测试中使用@DirtiesContext注释 - 在每次测试之前清理并设置您的数据库

关于java - SpringBoot @interface 总结不同注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61474599/

相关文章:

java - 如何在 Junit 中使 `_logger.isDebugEnabled()` 条件为假?

java - 如何为使用新的内部函数创建对象的java类编写junit测试?

java - 如何查看远程 pc 文件夹中的 java 更改?

java - 在java中向int []数组添加一个元素

spring - 登录Grails:使用Log4j2重新加载外部配置

java - QueryDsl MongoDB - 访问深度嵌套对象进行查询

java - 如何根据可选依赖项验证行为

java - 将 Firebase 函数的变量声明为最终变量。检查用户名和电子邮件是否存在

java - Amazon SWF 并行子工作流执行停止父工作流

Java/Springboot : Catch and handle a particular exception in one place?