当前位置:  开发笔记 > 编程语言 > 正文

什么是最好的Java模拟框架?

如何解决《什么是最好的Java模拟框架?》经验,为你挑选了10个好方法。

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



1> Brian Lafram..:

我使用Mockito取得了很大的成功.

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

我喜欢Mockito,因为它简单而干净的语法让我能够很快掌握.最小的语法旨在很好地支持常见的情况,虽然我需要做一些更复杂的事情我发现我想要的东西是支持和易于掌握的.

这是Mockito主页上的一个(删节)示例:

import static org.mockito.Mockito.*;

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

它没有那么简单.

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


美丽.对于静态方法,只需将Mockito与JMockit结合起来,实际上几乎没有类"太遗产"供您测试.
我喜欢当你尝试做一些你不应该做的事情时(例如创建内联模拟),你可以非常明确地解释你在异常消息中做错了什么.
对我来说,绝对.我仍然会无条件推荐它.当然,如果您发现另一个更符合您需求的框架,请在另一个答案中提及它,看看它获得了哪些投票以及它收到的评论类型.
@MexicanHacker为什么你不能在Android上使用它?我正在使用Robolectric.
我正在使用Mockito并喜欢它!伟大的文档(很难找到这个质量的文档,作者的好工作),这对我们来说非常重要,无需深入挖掘框架的代码!

2> Jan Kronquis..:

我是PowerMock的创造者所以显然我必须推荐它!:-)

PowerMock扩展了EasyMock和Mockito,能够模拟静态方法,最终甚至是私有方法.EasyMock支持已完成,但Mockito插件需要更多工作.我们还计划添加JMock支持.

PowerMock并不打算替换其他框架,而是可以在其他框架不允许模拟的棘手情况下使用它.PowerMock还包含其他有用的功能,例如抑制静态初始化器和构造器.



3> Rogério..:

该JMockit项目网站包含了大量的信息,比较当前的嘲弄工具包.

特别是,查看功能比较矩阵,其中包括EasyMock,jMock,Mockito,Unitils Mock,PowerMock,当然还有JMockit.我尽可能地保持其准确和最新.



4> Kris Pruden..:

我在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...
}

它有一个Expectations接口,允许记录/播放场景:

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.


只是一个更新:JMockit项目转移到http://code.google.com/p/jmockit.自从这篇文章(并且仍在不断发展)以来,它已经发展了很多,现在有了大量的文档.

5> p3t0r..:

您还可以使用Groovy查看测试.在Groovy中,您可以使用'as'运算符轻松模拟Java接口:

def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest 

除了这个基本功能外,Groovy还提供了更多关于模拟前端的功能,包括强大的功能MockForStubFor类.

http://docs.codehaus.org/display/GROOVY/Groovy+Mocks



6> trafalmadori..:

我开始使用EasyMock的模拟.很容易理解,但重播步骤有点烦人.Mockito删除了这个,也有一个更清晰的语法,因为看起来可读性是它的主要目标之一.我不能强调这是多么重要,因为大多数开发人员会花时间阅读和维护现有代码,而不是创建代码.

另一个好处是接口和实现类以相同的方式处理,不像EasyMock,你仍然需要记住(和检查)使用EasyMock类扩展.

我最近快速浏览了JMockit,虽然功能的清单非常全面,但我认为这样做的代价是结果代码的易读性,并且必须写更多内容.

对我来说,Mockito击中了最佳位置,易于编写和阅读,并处理大多数代码所需的大多数情况.使用Mockito和PowerMock将是我的选择.

需要考虑的一件事是,如果您自己开发,或者在一个小型的紧密团队中进行开发,您可能选择的工具对于拥有不同技能水平的开发人员的大公司来说可能不是最好的选择.在后一种情况下,需要更多考虑可读性,易用性和简单性.如果很多人最终没有使用它或不维护测试,那么获得最终的模拟框架是没有意义的.



7> dlinsin..:

我们在工作中大量使用EasyMock和EasyMock Class Extension,并对它非常满意.它基本上为您提供所需的一切.看看文档,这是一个非常好的例子,它向您展示了EasyMock的所有功能.



8> 小智..:

我很早就使用了JMock.我在上一个项目中尝试了Mockito并且喜欢它.更简洁,更清洁.PowerMock涵盖了Mockito中不存在的所有需求,例如模拟静态代码,模拟实例创建,模拟最终类和方法.所以我需要完成我的工作.



9> Andrea Franc..:

我喜欢JMock因为你能够设定期望.这与检查是否在某些模拟库中调用方法完全不同.使用JMock,您可以编写非常复杂的期望.看到j​​mock 作弊.



10> Bartosz Bier..:

是的,Mockito是一个很棒的框架.我和hamcrest以及Google guice一起使用它来设置我的测试.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有