![](/img/trans.png)
[英]Mockito doReturn doesn't return mocked Interface in MVC with singleton
[英]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.