2012-05-26 39 views
7

我目前正在编写一些涉及JMock的测试。我无法理解的代码结构如下:JMock - 添加期望的奇怪语法

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

慢慢分析,据我所知,

context.checking(new Expectations() { ... } 

这将产生Expectations的anonoymous instantiateion。但是为什么我们在这之后有另一个括号,然后是一些奇怪的静态我相信,诸如允许()等方法?如果有人能够从Java角度向我解释发生了什么,我将非常感激。

回答

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

有些人认为,建立在静态initialisers预期,静态方法 提供很酷,简洁,流畅,易读的语法指定的预期 - 我同意他们的观点。尴尬的语法不仅是嘲讽框架中很酷的事情 - 引擎盖下有很多很酷的字节码操作。

+1

不是真的回答我的问题,我很害怕 – Bober02

6

实例初始值设定项很有趣。他们只有我真的看到他们使用很多与JMock。考虑一个更简单,更容易理解的上下文。您可以创建地图并添加项目:

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

也许这会帮助您了解JMock正在做的事情。