我目前正在编写一些涉及JMock的测试。我无法理解代码的以下结构:
context.checking(new Expectations() { //context is of type Mockery of course
{
allowing(csv).getFileName();
will(returnValue(fileName));
}
});
据我所知,慢慢分析,
context.checking(new Expectations() { ... }
这将生成Expectations
的非正式实例化。但是为什么我们之后会有另一个括号,然后我会相信一些奇怪的静态方法,例如allow()等?如果有人能从Java的角度向我解释这里发生了什么,我将非常感激。
答案 0 :(得分:6)
第二组大括号构成instance initialization block,其编码被编译器复制到类的每个构造函数中。这使您可以访问实例成员。在JMock的API的情况下,它提供了初始化期望的简洁方法。您可以使用模板方法实现相同的功能(尽管在使用构造函数编译Expectations
本身关于对可重写方法的不安全调用时会发出警告)。
public abstract class Expectations {
public Expectations() {
buildExpectations();
}
protected abstract void buildExpectations();
...
}
在你的考试中
context.checking(new Expectations() {
protected void buildExpectations() {
allowing(csv).getFileName();
will(returnValue(fileName));
}
});
我绝对更喜欢短版本。 :)
答案 1 :(得分:6)
实例初始化器很有趣。他们只有我真正看到他们使用的很多是JMock。考虑一个更简单易懂的背景。您可以创建地图并向其添加项目:
Map<String,String> map = new HashMap<String,String>(){
{
put("One","Something");
put("Two","Other");
}
};
也许这会帮助您了解JMock正在做什么。
答案 2 :(得分:1)
有些人认为使用静态方法在静态初始化程序中创建期望值 提供外观酷炫,简洁,流畅且易于阅读的语法,用于指定期望 - 我同意他们的看法。笨拙的语法不仅在模拟框架中很酷 - 在引擎盖下有很多很酷的字节码操作。