我在为一些大型代码库编写单元测试用例时遇到了困难,我必须模拟很多类,以便我可以轻松地进行测试。我在 Jmock 的 API 文档中发现我可以使用的 customeconstraint 包含一个方法
eval(Object argo)
如果参数符合预期,这将返回 true。
但是我的方法是用多个参数调用的。如何评估参数并确保调用该方法的参数是正确的。提前致谢。
通常创建等于预期参数值的对象就足够了:
context.checking(new Expectations() {{
allowing(calculator).add(1, 2);
will(returnValue(3));
DateTime loadTime = new DateTime(12);
DateTime fetchTime = new DateTime(14);
allowing(reloadPolicy).shouldReload(loadTime, fetchTime);
will(returnValue(false));
}});
JMock 还提供了一些预定义的约束:
context.checking(new Expectations() {{
allowing(calculator).sqrt(with(lessThan(0));
will(throwException(new IllegalArgumentException());
}});
您还可以使用自定义匹配器with
:
context.checking(new Expectations() {{
DateTime loadTime = new DateTime(12);
allowing(reloadPolicy).shouldReload(with(equal(loadTime)), with(timeGreaterThan(loadTime));
will(returnValue(false));
}});
这里timeGreaterThan
可以定义为:
public class TimeGreaterThanMatcher extends TypeSafeMatcher<DateTime> {
private DateTime minTime;
public TimeGreaterThanMatcher(DateTime minTime) {
this.minTime = minTime;
}
public boolean matchesSafely(DateTime d) {
return d != null && minTime.isBefore(d);
}
public StringBuffer describeTo(Description description) {
return description.appendText("a DateTime greater than ").appendValue(minTime);
}
public static Matcher<DateTime> timeGreaterThan(DateTime minTime) {
return new TimeGreaterThanMatcher(minTime);
}
}
有关更多信息,请参阅JMock 食谱