我有一个自己的单元测试注释,看起来像
@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/