JMock - 添加期望的奇怪语法

时间:2012-05-26 19:13:57

标签: java mocking jmock

我目前正在编写一些涉及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的角度向我解释这里发生了什么,我将非常感激。

3 个答案:

答案 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)

有些人认为使用静态方法在静态初始化程序中创建期望值 提供外观酷炫,简洁,流畅且易于阅读的语法,用于指定期望 - 我同意他们的看法。笨拙的语法不仅在模拟框架中很酷 - 在引擎盖下有很多很酷的字节码操作。