我的用例是我使用的是JUnit 5,需要模拟静态方法YearMonth.now()。为了做到这一点,我使用的解决方案是:
YearMonth defaultYearMonth = YearMonth.of(DEFAULT_YEAR, Month.MARCH);
try (MockedStatic<YearMonth> mockedScope = Mockito.mockStatic(YearMonth.class)) {
mockedScope.when(YearMonth::now).thenReturn(defaultYearMonth);
// Rest of the code
// StepVerifier to verify a subscription
}现在的问题是,由于在模拟作用域中模拟YearMonth,所以不能对所有其他方法进行模拟。但我想为YearMonth.from()调用真正的方法。要做到这一点,我所做的就是尝试添加
mockedScope.when(() -> YearMonth.from(any())).thenCallRealMethod();但是这不起作用,我得到了调用null的YearMonth.from(LocalDateTime)。
我不知道我错过了什么。如果可能是因为模拟YearMonth类,那么是否有办法监视静态方法?如果没有任何帮助,如何用JUnit 5实现这一点将是非常有帮助的。
发布于 2021-04-06 10:55:55
如果您查看Mockito.mockStatic(Class<T>)的Javadoc,您将看到所有静态方法都是模拟的,这意味着如果在测试范围内使用它们,则需要手动处理它们。
为给定类或接口的所有静态方法创建线程本地模拟控制器。..。
修复它的方法是根据Javadoc为您的mockStatic方法使用额外的参数。第二个参数是defaultAnswer
defaultAnswer -调用静态方法时的默认答案。
MockedStatic<YearMonth> mockedScope = Mockito.mockStatic(YearMonth.class, Mockito.CALLS_REAL_METHODS)https://stackoverflow.com/questions/66966931
复制相似问题