用Java创建模拟对象的最佳框架是什么?为什么?每个框架的优点和缺点是什么?


当前回答

我已经成功使用Mockito。

当我尝试学习JMock和EasyMock时,我发现学习曲线有点陡峭(尽管可能只有我这样)。

我喜欢Mockito,因为它的语法简单干净,我可以很快掌握。最小语法的设计是为了很好地支持常见的情况,尽管有几次我需要做一些更复杂的事情,但我发现我想要的东西是支持的,而且很容易掌握。

以下是Mockito主页的一个例子:

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

没有比这更简单的了。

我能想到的唯一主要缺点是它不会模拟静态方法。

其他回答

我已经成功使用Mockito。

当我尝试学习JMock和EasyMock时,我发现学习曲线有点陡峭(尽管可能只有我这样)。

我喜欢Mockito,因为它的语法简单干净,我可以很快掌握。最小语法的设计是为了很好地支持常见的情况,尽管有几次我需要做一些更复杂的事情,但我发现我想要的东西是支持的,而且很容易掌握。

以下是Mockito主页的一个例子:

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

没有比这更简单的了。

我能想到的唯一主要缺点是它不会模拟静态方法。

JMockit项目网站包含大量当前模拟工具包的比较信息。

特别是,请查看特性比较矩阵,其中包括EasyMock、jMock、Mockito、unitil Mock、PowerMock,当然还有JMockit。我尽量让它保持准确和最新。

我喜欢JMock,因为您能够设置期望。这与检查在某些模拟库中是否调用了某个方法完全不同。使用JMock可以编写非常复杂的期望。看那个jmock骗子。

我们在工作中大量使用EasyMock和EasyMock类扩展,并且对它非常满意。它基本上能满足你所有的需求。看一下文档,有一个非常好的例子,它向您展示了EasyMock的所有特性。

我已经成功地使用了JMockit。

它是相当新的,所以它有点原始,文档不足。它使用ASM动态地重新定义类字节码,因此它可以模拟所有方法,包括静态、私有、构造函数和静态初始化器。例如:

import mockit.Mockit;

...
Mockit.redefineMethods(MyClassWithStaticInit.class,
                       MyReplacementClass.class);
...
class MyReplacementClass {
  public void $init() {...} // replace default constructor
  public static void $clinit{...} // replace static initializer
  public static void myStatic{...} // replace static method
  // etc...
}

它有一个期望界面,允许记录/回放场景以及:

import mockit.Expectations;
import org.testng.annotations.Test;

public class ExpecationsTest {
  private MyClass obj;

  @Test
  public void testFoo() {
    new Expectations(true) {
      MyClass c;
      {
        obj = c;
        invokeReturning(c.getFoo("foo", false), "bas");
      }
    };

    assert "bas".equals(obj.getFoo("foo", false));

    Expectations.assertSatisfied();
  }

  public static class MyClass {
    public String getFoo(String str, boolean bool) {
      if (bool) {
        return "foo";
      } else {
        return "bar";
      }
    }
  }
}

缺点是它需要Java 5/6。