Java 使用Mockito 3.x的单元测试随机失败

Java 使用Mockito 3.x的单元测试随机失败,java,mockito,Java,Mockito,以下是我测试中的相关代码: private MockedStatic<MyDAO> myDAOStaticMock; @Captor ArgumentCaptor<SomeInput> someInputCaptor; @Before public void before() { myDAOStaticMock = Mockito.mockStatic(MyDAO.class); } @After public void after() { myDAOSta

以下是我测试中的相关代码:

private MockedStatic<MyDAO> myDAOStaticMock;

@Captor
ArgumentCaptor<SomeInput> someInputCaptor;

@Before
public void before() {
  myDAOStaticMock = Mockito.mockStatic(MyDAO.class);
}

@After
public void after() {
  myDAOStaticMock.close();
}

@Test
public void test() {
  thingImTesting.methodThatCallsDaoStatically();

  myDAOStaticMock.verify(() -> MyDao.staticMethod(someInputCaptor.capture()), times(2));
}
private MockedStatic myDAOStaticMock;
@俘虏
ArgumentCaptor someInputCaptor;
@以前
在()之前公开无效{
myDAOStaticMock=Mockito.mockStatic(MyDAO.class);
}
@之后
在()之后公共无效{
myDAOStaticMock.close();
}
@试验
公开无效测试(){
thingImTesting.methodthattcalls静态();
验证(()->MyDao.staticMethod(someInputCaptor.capture()),次(2);
}
当我在intellij中运行这个测试时,它几乎总是有效的。当它在我们的构建系统中运行时,每次都会失败。错误是与此模拟的交互为0

当我的所有其他静态检查都正常工作时,这个特定的验证可能会有什么问题


编辑:我对问题原因的理解是错误的,静态检查与此无关。有关更多信息,请参阅我的答案。

关于这些测试在构建系统中失败的原因,我错了。我编写的单元测试名为DateTime.now(),它的结果因运行代码的时区而异。我的构建系统在不同的时区运行代码,因此在该上下文中测试失败


通过在我的单元测试中明确说明时区(例如DateTime.now().withZone(无论什么)),我能够解决这个问题。

如果您像构建系统那样在命令行上编译测试(例如mvn测试…),您是否有与构建系统中观察到的问题相同的问题?这到底是一个时区问题?你的问题没有提到任何日期或时区。请编辑您的问题和答案,包括更改/设置时区如何解决您的问题的描述。顺便说一句,我在编写单元测试时花了很长时间,使所有日期和时间值都可以硬连线,即调用DateTime.now()的代码在我的代码中的单元测试期间永远不会运行。其原理是让单元测试没有外部依赖性。DateTime.now(带区域或不带区域)与生产数据库一样糟糕,人们根本无法控制它。从长远来看,具有外部依赖关系的单元测试往往不太稳定。我在Java API方面遇到了一些问题,这些API使用系统默认值来简化某些参数,比如编码、语言环境或时区。我已经了解了这些API中的大多数,并尝试避免它们,并显式地传递参数。当然,除非我在需要的环境中工作,但这不是我的情况。