【问题标题】:Mockito. Spy doReturn doesn't change return value莫基托。间谍 doReturn 不会改变返回值
【发布时间】:2023-01-26 16:56:10
【问题描述】:

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

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());
    }
}

【问题讨论】:

    标签: java mockito


    【解决方案1】:

    看起来你在嘲笑类的错误实例。在测试用例中,您正在模拟 ServiceHelper 类的 spy 实例,但您正在调用 serviceToTest 实例上的方法,这是原始的“未模拟”对象。要解决此问题,您应该在间谍实例上调用该方法,如下所示:

    LocalDateTime tokenExpireDate = spy.calculateApiTokenExpireDate();
    

    此外,我建议您阅读官方文档中的that section,其中包含很好的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2012-05-04
      • 2018-03-02
      • 2022-07-01
      • 1970-01-01
      • 2011-04-03
      相关资源
      最近更新 更多