我有自己的单元测试注释,如下所示
@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而不是它成功的时候。如果我在一个更大的复合中运行它,它会因为一些奇怪的DB实体失败而失败。为了简洁起见,我跳过了细节。
当我取消注释(1)的时候--无论是单独的还是复合的--都是成功的。现在我认为@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)已经足够了。但显然不是。
有谁想过
@interface声明中可以概括什么?从这个意义上说,这些都是使用的,而且是'meaningful'@SpringBootTest()吗?我认为在interface中声明就足够了。更新
“对于一些奇怪的DB实体故障”--意味着测试将数据保存到DB中,并且在检索数据时无法正确地恢复枚举。引发的异常表明检索了一些似乎从未存储过的虚假数据。跟踪具体问题超出了这个问题的范围,因为我找到了一个解决方案--我做的是而不是理解的。为了避免遇到类似的问题,我想要更清楚地说明如何使用@interface。
发布于 2020-04-28 07:23:27
我猜您在一个测试中操作数据库中的数据,因此下一个测试没有假设的数据。Spring出于性能原因在测试之间重用应用程序上下文,而不重置它。
有两种解决方案:-在测试中使用@DirtiesContext注释-清理和在每次测试之前设置db
https://stackoverflow.com/questions/61474599
复制相似问题