我有一段这样的代码:
class Lekcja {
Calendar _date;
public Lekcja() {
_date = Calendar.getInstance();
}
public Calendar getDate() {
return _date;
}
}
我想使用 JUnit4 和 Mockito 来测试它,而不是使用真正的 Calendar 对象,我想在那里放置一个模拟对象。你能告诉我该怎么做吗?
最佳答案
模拟值对象很少是一个好主意。你应该模拟行为,而不是数据。我想您真正想要实现的是能够在测试中使用任意日期(这是一个好主意)。
在这种情况下我成功使用的模式是 fake system clock (该网站的示例):
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 - 模拟 Mockito 中我们无法显式分配的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10846269/