我有一段这样的代码:
class Lekcja {
Calendar _date;
public Lekcja() {
_date = Calendar.getInstance();
}
public Calendar getDate() {
return _date;
}
}
我想使用 JUnit4 和 Mockito 测试它,而不是使用真正的日历对象,我想在那里放置一个模拟对象。你能告诉我怎么做吗?
模拟值对象很少是一个好主意。你应该嘲笑行为,而不是数据。我想你真正想要实现的是能够在测试中使用任意日期(这是一个好主意)。
在这种情况下,我成功使用的模式是假系统时钟(来自该站点的示例):
public interface TimeSource {
long currentTimeMillis();
}
还有两个实现,真正的:
public final class RealSource implements TimeSource {
public long currentTimeMillis() {
return System.currentTimeMillis();
}
}
和假的测试:
public final class FakeSource implements TimeSource {
public long currentTimeMillis() {
return //...whatever you want
}
}
我发现在帮助程序方法中使currentTimeMillis()
静态并使用指向当前TimeSource
static
字段很方便。
最后,更简单的方法是直接传递日期:
class Lekcja {
Calendar _date;
public Lekcja(Calendar date) {
this._date = date;
}
//...
}
参见
- 在 Java 中对基于时间的逻辑进行单元测试
你可以
使用PowerMock
@RunWith(PowerMockRunner.class)
@PrepareForTest(Calendar.class)
public class LekcjaTest {
private Lekcja lekcja;
private Date myDate;
@Before
public void setUp() {
myDate = mock(Date.class);
PowerMockito.mockStatic(Calendar.class);
PowerMockito.when(Calendar.getInstance()).thenReturn(myDate);
}
@Test
public void calendarTest() {
lekcja = new Lekcja();
//verifies that the static call has been made
PowerMockito.verifyStatic();
Calendar.getInstance();
assertEquals(myDate, lekcja.getDate());
}
}