JMock - 添加期望的奇怪语法

Bob*_*r02 7 java mocking jmock

我目前正在编写一些涉及JMock的测试.我无法理解代码的以下结构:

context.checking(new Expectations() {  //context is of type Mockery of course
            {
                allowing(csv).getFileName();
                will(returnValue(fileName));
            }
        });
Run Code Online (Sandbox Code Playgroud)

据我所知,慢慢分析,

context.checking(new Expectations() { ... }
Run Code Online (Sandbox Code Playgroud)

这将产生一个非常实例化的Expectations.但是为什么我们之后会有另一个括号,然后我会相信一些奇怪的静态方法,例如allow()等?如果有人能从Java的角度向我解释这里发生了什么,我将非常感激.

Dav*_*ess 6

第二组大括号构成一个实例初始化块,其代码由编译器复制到该类的每个构造函数中.这使您可以访问实例成员.在JMock的API的情况下,它提供了初始化期望的简洁方法.您可以Expectations使用模板方法实现相同的功能(虽然在编译自己关于对构造函数中的可重写方法的不安全调用时会发出警告).

public abstract class Expectations {
    public Expectations() {
        buildExpectations();
    }

    protected abstract void buildExpectations();

    ...
}
Run Code Online (Sandbox Code Playgroud)

在你的测试中

context.checking(new Expectations() {
    protected void buildExpectations() {
        allowing(csv).getFileName();
        will(returnValue(fileName));
    }
});
Run Code Online (Sandbox Code Playgroud)

我绝对更喜欢短版本.:)


cjs*_*hno 6

实例初始化器很有趣.他们只有我真正看到他们使用的很多是JMock.考虑一个更简单易懂的背景.您可以创建地图并向其添加项目:

Map<String,String> map = new HashMap<String,String>(){
    {
        put("One","Something");
        put("Two","Other");
    }
};
Run Code Online (Sandbox Code Playgroud)

也许这会帮助您了解JMock正在做什么.