如何使用Mockito和Junit模拟区域日期时间

a9wyjsp7  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(382)

我需要模拟一个ZonedDateTime.ofInstant()方法。我知道在SO中有很多建议,但对于我的具体问题,到目前为止我还没有得到任何简单的解决方法。
下面是我的代码:

public ZonedDateTime myMethodToTest(){

    MyClass myClass;
    myClass = fetchSomethingFromDB();
    try{
        final ZoneId systemDefault = ZoneId.systemDefault();
        return ZonedDateTime.ofInstant(myClass.getEndDt().toInstant(), systemDefault);
    } catch(DateTimeException dte) {
        return null;
    }

}

下面是我的不完整测试方法:

@Mock
 MyClass mockMyClass;

 @Test(expected = DateTimeException.class)
 public void testmyMethodToTest_Exception() {
    String error = "Error while parsing the effective end date";
    doThrow(new DateTimeException(error)).when(--need to mock here---);
    ZonedDateTime dateTime = mockMyClass.myMethodTotest();
}

我想模拟ZonedDateTime.ofInstant()方法,在解析负面场景时抛出DateTimeException。我如何做到这一点。

4dc9hkyq

4dc9hkyq1#

从现在起(18/03/2022)Mockito支持模拟静态方法。

@Test
public void testDate() {
    String instantExpected = "2022-03-14T09:33:52Z";
    ZonedDateTime zonedDateTime = ZonedDateTime.parse(instantExpected);

    try (MockedStatic<ZonedDateTime> mockedLocalDateTime = Mockito.mockStatic(ZonedDateTime.class)) {
        mockedLocalDateTime.when(ZonedDateTime::now).thenReturn(zonedDateTime);

        assertThat(yourService.getCurrentDate()).isEqualTo(zonedDateTime);
    }
}

请注意,你需要使用mockito-inline依赖关系:

<dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-inline</artifactId>
        <version>4.4.0</version>
    </dependency>
bmp9r5qi

bmp9r5qi2#

您不能使用Mockito来实现这一点,因为ZonedDateTime是一个final类,而ofInstant是一个 static 方法,但是您可以使用PowerMock库来增强Mockito的功能:

final String error = "Error while parsing the effective end date";
// Enable static mocking for all methods of a class
mockStatic(ZonedDateTime.class);
PowerMockito.doThrow(new DateTimeException(error).when(ZonedDateTime.ofInstant(Mockito.anyObject(), Mockito.anyObject()));

相关问题