Junit Mockito和JMockIt之间的主要区别

Junit Mockito和JMockIt之间的主要区别,junit,mocking,mockito,jmockit,Junit,Mocking,Mockito,Jmockit,这是我在最初尝试使用JMockIt时发现的。我必须承认,我发现JMockIt文档对于它提供的内容非常简洁,因此我可能遗漏了一些东西。尽管如此,我的理解是: Mockito: List a = mock(ArrayList.class) does not stub out all methods of List.class by default. a.add("foo") is going to do the usual thing of adding the element to the lis

这是我在最初尝试使用JMockIt时发现的。我必须承认,我发现JMockIt文档对于它提供的内容非常简洁,因此我可能遗漏了一些东西。尽管如此,我的理解是:

Mockito: List a = mock(ArrayList.class) does not stub out all methods
of List.class by default. a.add("foo") is going to do the usual thing
of adding the element to the list.

JMockIt: @Mocked ArrayList<String> a;
It stubs out all the methods of a by default. So, now a.add("foo")
is not going to work.

This seems like a very big limitation to me in JMockIt.
How do I express the fact that I only want you to give me statistics
of add() method and not replace the function implementation itself
What if I just want JMockIt to count the number of times method  add()
was called, but leave the implementation of add() as is?

I a unable to express this in JMockIt. However, it seems I can do this
in Mockito using spy()
这样的声明

inOrder.verify(mockDatabase, times(2)).save((Article) notNull());
在Mockito中,在JMockIt中没有等效项,正如您从上面的示例中看到的那样

new NonStrictExpectations(Foo.class, Bar.class, zooObj)
{
    {
        // don't call zooObj.method1() here
        // Otherwise it will get stubbed out
    }
};


new Verifications()
{
    {
        zooObj.method1(); times = N;
    }
};

Mockito是一个比JMockIT旧得多的库,所以您可以预期它会有。如果您想查看一些文档较少的功能,请通读发行版列表。JMockIT的作者们在他们的作品中遗漏了其他框架所做的每一件他们没有做的事情,并且犯了几个错误(例如,Mockito可以进行严格的模拟和排序)

Mockito也是为了启用单元级BDD而编写的。这通常意味着,如果您的测试提供了一个关于如何使用代码的好例子,并且如果您的代码可爱、解耦且设计良好,那么您就不需要JMockIT提供的所有把戏。在开源中,最难做的事情之一就是对许多从长远来看没有帮助的请求说“不”

比较和头版上的示例,看看真正的区别。这不是关于你测试什么,而是关于你的测试记录和描述类的行为有多好

兴趣声明:Szczepan和我在撰写Mockito的初稿时在同一个项目上,他看到我们中的一些人推出了自己的存根类,而不是使用当时现有的mocking框架。所以我觉得这一切都是他为我写的,我完全有偏见。谢谢Szczepan。

事实上,默认情况下,所有模拟API都会模拟或删除模拟类型中的每个方法。我想你把
mock(type
)(“完全”mocking)和
spy(obj)
(部分mocking)混淆了

JMockit可以完成所有这些,在每种情况下都有一个简单的API。所有这些都在本文中进行了描述,并附有示例。 为了证明这一点,您可以看到(有更多已从较新版本的工具包中删除,但仍可以在中找到),或者许多JMockit集成测试(目前超过1000个)

与Mockito的
spy
等效的是JMockit中的“动态部分模拟”。只需将要部分模拟的实例作为参数传递给
expections
构造函数。如果没有记录期望值,则在执行测试代码时将执行实际代码。顺便说一句,Mockito在这里有一个严重的问题(JMockit没有),因为它总是执行真正的代码,即使在(…)或
验证(…)
时在
内部调用它;正因为如此,人们不得不使用
doReturn(…)。when(…)
来避免被监视对象的意外

关于调用的验证,JMockit验证API比任何其他API都要强大得多。例如:

new VerificationsInOrder() {{
    // preceding invocations, if any
    mockDatabase.save((Article) withNotNull()); times = 2;
    // later invocations, if any
}};

请看这篇文章:事实上,这并不等同。我不认为JMockIt能做到这一点对不起,你有很多地方做错了。如果您认为有其他工具可以做而JMockit不能做的事情,请给我看一个测试。我已经提供了证据:请参阅样本测试套件以比较JMockit和Mockito,以及等效的测试对,包括在Mockito站点中找到的所有测试。(如果我漏掉了,请告诉我。)Mockito不支持严格的mock,也就是说,那些漏掉和意外调用的报告没有额外的验证代码。关于支持好的设计,它是相反的:McCito阻止它。Lunivore,我花了数百个小时学习不仅MoCito,而且所有其他嘲弄工具java(也花了一些时间在C++,.NET,Ruby和Python嘲弄工具)。例如,我知道人们经常会遇到Mockito的局限性,并要求添加支持(参见问题12、101和130,或邮件列表中的帖子,如此:)。有关社区参与JMockit项目的证据,请查看问题、“JMockit用户”讨论组或更改历史页面。关于对良好OO设计实践的支持,我创建JMockit正是因为现有工具(EasyMock和jMock,2005年底)缺乏,而且它们仍然存在。使用“传统”的模拟API,我无法:a)单元测试一个碰巧使用静态持久化外观的类,即使这个特定模式在现实世界中对我(和coleagues)非常有效;b) 遵循任何关于API设计的书籍中关于正确使用继承的建议。我在“about JMockit”页面和JMockit教程中写过这样的设计主题。我也更喜欢构图。使用JMockit,开发人员可以正确地设计扩展,使类或方法
final
表明它们不应该被继承;这鼓励使用组合,而不会降低编写单元测试的能力。我很少使用单例,但是静态方法可以发挥很大的作用,就像我提到的那样,或者作为构造函数的替代方法;JMockit让开发人员可以自由决定是否使用它们,而不会成为纳粹分子。我对优秀设计的概念与福勒、布洛赫、麦康奈尔等作家的概念一致现在在这里进行太复杂了!但是很高兴这么做。我在你提供的链接上得到404。你能提供最新的链接吗?我正在努力学习它。
new VerificationsInOrder() {{
    // preceding invocations, if any
    mockDatabase.save((Article) withNotNull()); times = 2;
    // later invocations, if any
}};