如何使用Mockito在Java中模拟新的Date()

我有一个使用当前时间进行一些计算的函数。我想使用模仿器模拟它。

我要测试的课程示例:

public class ClassToTest {

public long getDoubleTime(){

return new Date().getTime()*2;

}

}

我想要类似的东西:

@Test

public void testDoubleTime(){

mockDateSomeHow(Date.class).when(getTime()).return(30);

assertEquals(60,new ClassToTest().getDoubleTime());

}

可以嘲笑吗?我不想更改“已测试”的代码以进行测试。

回答:

正确的做法是重组代码,使其更具可测试性,如下所示。重组代码以消除对Date的直接依赖关系将使您可以为正常运行时和测试运行时注入不同的实现:

interface DateTime {

Date getDate();

}

class DateTimeImpl implements DateTime {

@Override

public Date getDate() {

return new Date();

}

}

class MyClass {

private final DateTime dateTime;

// inject your Mock DateTime when testing other wise inject DateTimeImpl

public MyClass(final DateTime dateTime) {

this.dateTime = dateTime;

}

public long getDoubleTime(){

return dateTime.getDate().getTime()*2;

}

}

public class MyClassTest {

private MyClass myClassTest;

@Before

public void setUp() {

final Date date = Mockito.mock(Date.class);

Mockito.when(date.getTime()).thenReturn(30L);

final DateTime dt = Mockito.mock(DateTime.class);

Mockito.when(dt.getDate()).thenReturn(date);

myClassTest = new MyClass(dt);

}

@Test

public void someTest() {

final long doubleTime = myClassTest.getDoubleTime();

assertEquals(60, doubleTime);

}

}

以上是 如何使用Mockito在Java中模拟新的Date() 的全部内容, 来源链接: utcz.com/qa/427103.html

回到顶部