繁体   English   中英

Mockito. Spy doReturn 不改变返回值

[英]Mockito. Spy doReturn doesn't change return value

我想测试方法calculateApiTokenExpireDate() 我为currentDateTime()创建了一个间谍,以便它返回 static 日期。 但它仍然返回当前日期。 有人可以告诉我我的错误在哪里吗? 谢谢

public class ServiceHelper {

    static final long DEFAULT_OUTDATED_TIME_MILLIS = 86400000;
    static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm";

    long oneTimeOutDatedMillis = DEFAULT_OUTDATED_TIME_MILLIS;

    protected String getApiTokenExpireDate(){
        DateTimeFormatter customFormat = DateTimeFormatter.ofPattern(DATE_TIME_PATTERN);
        LocalDateTime tokenExpireDate = calculateApiTokenExpireDate();
        return tokenExpireDate.format(customFormat);
    }

    protected LocalDateTime calculateApiTokenExpireDate(){
        LocalDateTime now = currentDateTime();
        return now.plus(oneTimeOutDatedMillis, ChronoUnit.MILLIS);
    }

    protected LocalDateTime currentDateTime() {
        return LocalDateTime.now();
    }
}
public class ServiceHelperTest {

    private ServiceHelper serviceToTest;

    private ServiceHelper spy;

    @BeforeEach
    void beforeEach() {
        serviceToTest = new ServiceHelper();
        serviceToTest.oneTimeOutDatedMillis = 86400000;
        spy = Mockito.spy(serviceToTest);
    }

    @Test
    void calculateApiTokenExpireDate_return_plus_one_day_date() {
        /* prepare */
        doReturn(LocalDateTime.of(2023, 1, 24, 14, 1)).when(spy).currentDateTime();

        /* execute */
        LocalDateTime tokenExpireDate = serviceToTest.calculateApiTokenExpireDate();

        /* test */
        assertEquals(2023, tokenExpireDate.getYear());
        assertEquals(1, tokenExpireDate.getMonthValue());
        assertEquals(25, tokenExpireDate.getDayOfMonth());
    }
}

看起来你是 mocking class 的错误实例。在测试用例中,你是 mocking ServiceHelper class 的spy实例,但你正在调用serviceToTest实例上的方法,这是原始的“未模拟” 88282995To402888解决这个问题,你应该在间谍实例上调用方法,如下所示:

LocalDateTime tokenExpireDate = spy.calculateApiTokenExpireDate();

另外,我建议您阅读官方文档中的该部分,其中包含很好的示例。

无法侦测this的调用,因为this引用未更改。 您可以将 class 更改为在java.time.Clock实例或返回当前日期/时间的函数/接口上接受。 然后你可以在你的测试中注入Clock#fixed()

Class:

public class ServiceHelper {

    static final long DEFAULT_OUTDATED_TIME_MILLIS = 86400000;
    static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm";

    private final Clock clock;

    long oneTimeOutDatedMillis = DEFAULT_OUTDATED_TIME_MILLIS;

    public ServiceHelper(final Clock clock) {
        this.clock = clock;
    }

    // ...

    protected LocalDateTime calculateApiTokenExpireDate(){
        LocalDateTime now = currentDateTime();
        return now.plus(oneTimeOutDatedMillis, ChronoUnit.MILLIS);
    }

    protected LocalDateTime currentDateTime() {
        return LocalDateTime.now(clock);
    }
}

测试:

public class ServiceHelperTest {
    private ServiceHelper serviceToTest;
    private Instant now;

    @BeforeEach
    void beforeEach() {
        /* prepare */
        now = Instant.now(); // or: Instant.parse("...")
        serviceToTest = new ServiceHelper(Clock.fixed(now, ZoneOffset.UTC));
        serviceToTest.oneTimeOutDatedMillis = 86400000;

    }

    @Test
    void calculateApiTokenExpireDate_return_plus_one_day_date() {
        /* execute */
        LocalDateTime tokenExpireDate = serviceToTest.calculateApiTokenExpireDate();

        /* test */
        // assert against this.now ...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM