public class AppUtil {
private static Utility util = new Utilities();
public static void load(Utility newUtil) {
this.util = newUtil;
}
public static Date getDate() {
return util.getDate();
}
}
然后在应用程序代码中:
private void doSomething() {
Date today = AppUtil.getDate();
....
}
然后,您可以在测试方法中加载一个模拟接口。
@Test
public void shouldDoSomethingUseful() {
Utility mockUtility = // .. create mock here
AppUtil.load(mockUtility);
// .. set up your expectations
// exercise the functionality
classUnderTest.doSomethingViaAPI();
// ... maybe assert something
}
7条答案
按热度按时间bhmjp9jg1#
您可以结合使用PowerMock和Mockito来模拟它:
在您的类中名列前茅:
成功的关键是必须将使用Calendar的类放在PrepareForTest中,而不是放在Calendar本身中,因为它是一个系统类(我个人在找到这个类之前搜索了很多)。
然后是嘲笑本身:
m0rkklqb2#
在我看来,你有三个明智的选择:
1.将
Calendar
示例注入到当天设置的任何方法/类中。private void method(final Calendar cal) { Date today = cal.getTime(); }
1.使用JodaTime而不是
Calendar
。这不是一个选项,而是一个建议,因为JodaTime会让您的工作变得更加轻松。您仍然需要将此时间注入到方法中。DateTime dt = new DateTime();
Date jdkDate = dt.toDate();
1.将
Calendar
Package 在某个允许获取时间的接口中,然后模拟该接口并让它返回一个常量Date
。Date today = calendarInterfaceInstance.getCurrentDate()
t3irkdon3#
不要嘲笑它,而是引入一个你可以嘲笑的获取日期的方法,比如:
然后你可以把它注入到你的类中,或者只是使用一个helper类,它包含一堆静态方法,接口包含一个load方法:
然后在应用程序代码中:
然后,您可以在测试方法中加载一个模拟接口。
另请参见Should you only mock types you own?和Test smell - everything is mocked
oxosxuxt4#
使用Mockito和PowerMockito:
有关完整代码,请参阅link。
u4vypkhs5#
编写一个名为
DateHelper
的类,其方法getCalendar
返回Calendar.getInstance()
。重构要测试的类,使其具有DateHelper
类型的成员变量和注入该成员变量的构造函数。在测试中使用该构造函数,以注入DateHelper
的模拟,其中getCalendar
已被存根化以返回某个已知日期。q5iwbnjs6#
您可以使用JMockit进行mockit。在这里您可以看到如何执行此操作:Mock Java Calendar - JMockit vs Mockito.
8yparm6h7#
避免使用
Calendar.getInstance()
,只使用Mockito
方法返回您喜欢的结果。例如:使用以下命令在Gradle文件中导入Mockito:
或者(如果您使用的是Groovy)