以下测试是我使用此Maven命令以随机顺序运行测试时失败的几个测试之一:*mvn -Dsurefire.runOrder=随机清洁测试 *
@Test
public void ShouldReturnCorrectAccountLoanSumForDebtRatioWhenRedemptionAmountIsNull(){
AccountVO account = mock(AccountVO.class);
CustomerGroupInformationVO group = mock(CustomerGroupInformationVO.class);
when(group.getCustomerIds()).thenReturn(Set.of("199406208123"));
when(account.getAccountOwners()).thenReturn(List.of((new AccountOwnerVO(null, "199406208123", null))));
when(account.getAmount()).thenReturn(BigDecimal.valueOf(500000));
when(account.getRedemptionAmount()).thenReturn(null);
assertEquals(BigDecimal.valueOf(500000), getAdjustedAccountLoanSumForDebtRatio(account, group, caseClientVO));
}
更具体地说,这是提到的行:
when(account.getAccountOwners()).thenReturn(List.of((new AccountOwnerVO(null, "199406208123", null))));
你知道是什么原因造成的吗?我怎么修复它?当我用mvn干净安装正常运行我的测试时,没有任何问题。我希望它以随机顺序工作的原因是我们的构建工具似乎在使用它,它不能构建。就像我说的,它在本地工作得很好。
1条答案
按热度按时间gj3fmq9x1#
因为Mockito通过side-effects stored in ThreadLocal variables工作,所以它特别容易受到测试污染的影响:如果您的测试在以随机顺序运行时失败,可能是因为某些先前的测试使mock处于它不期望的状态。另外,Mockito存根依赖于以特定顺序观察方法调用,如果它不能观察方法调用(例如当它们是
final
时)或者如果您在准备thenVerb
参数时与不同的mock交互,则可能导致奇怪的异常。您的第一道防线之一是使用
validateMockitoUsage
,它应该在每次测试结束时运行,并确认没有与Mockito的交互未完成。您可以将其放在@After
方法中,但如果使用MockitoJUnitRunner或MockitoRule,Mockito会自动执行此操作。如果可能,我建议使用后两种方法中的任何一种,尤其是MockitoRule。这将帮助你确认哪些测试有问题。一旦你到了那里,尝试以下测试:
final
支持的情况下模拟final
方法。如果Mockito不能覆盖您的模拟方法,它将无法检测到您的存根调用。如果您的任何方法是用Kotlin编写的,请记住,与Java不同,除非声明为open
,否则这些方法是final
。new AccountOwnerVO(...)
不应该与mock交互,但如果它与mock交互,那么Mockito可能会将其解释为您的when
调用从未得到thenReturn
(实际上它只是还没有得到它)。将返回值提取为局部变量是一个合理的尝试步骤。