Java 在Mockito中模仿我们不能明确指定的东西
我有这样一段代码:Java 在Mockito中模仿我们不能明确指定的东西,java,junit4,mockito,Java,Junit4,Mockito,我有这样一段代码: class Lekcja { Calendar _date; public Lekcja() { _date = Calendar.getInstance(); } public Calendar getDate() { return _date; } } 我想用JUnit4和Mockito来测试它,而不是用真正的Calendar对
class Lekcja {
Calendar _date;
public Lekcja() {
_date = Calendar.getInstance();
}
public Calendar getDate() {
return _date;
}
}
我想用JUnit4和Mockito来测试它,而不是用真正的Calendar对象,我想在那里放一个模拟对象。你能告诉我怎么做吗?模拟值对象很少是个好主意。你应该模仿行为,而不是数据。我想您真正想要实现的是能够在测试中使用任意日期(这是一个好主意) 我在这种情况下成功使用的模式是(来自该站点的示例): 和两个实现,real:
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;
}
//...
}
另见
- 您可以使用
从技术上讲,您可以使用PowerMock进行这种模拟,但您确实应该使用Tomasz answer。不要测试这个类。它没有任何逻辑,因此不存在逻辑错误的可能性,因此对它进行测试没有任何好处。认真地把时间花在不同的事情上。
class Lekcja {
Calendar _date;
public Lekcja(Calendar date) {
this._date = date;
}
//...
}
@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());
}
}