java - Mockito 与 JMock

标签 java junit mocking mockito stubbing

我正在尝试将我的一些单元测试从使用 JMock 转换为使用 Mockito,但遇到了一些障碍。

首先在我的测试中,当使用 JMock 时, stub 的验证和返回发生在一个步骤中,如下所示

    contextMockery.checking(new Expectations() {{
        oneOf(dateUtilityService).isBeforeToday(URGENT_DATE);
            will(returnValue(true));
    }});

这实质上验证了该方法正在被调用并同时返回固定值。如果未调用 isBeforeToday 方法并同时返回我的固定值 true,则测试失败。而在使用 Mockito 时,我必须验证是否正在调用该方法,然后在单独的步骤中返回我的固定值,这些步骤几乎是重复的,如下所示:

    doReturn(true).when(dateUtilityService).isBeforeToday(URGENT_DATE);
    verify(dateUtilityService).isBeforeToday(URGENT_DATE);

没有办法一步完成吗?

其次,如果我忘记按照我的预期列出对我的模拟之一的方法调用,JMock 会因“意外调用异常”而无法通过测试,我认为这是正确的,而 Mockito 会很高兴地通过测试,除非我明确验证对模拟的方法调用绝不能发生,这是正确的(似乎是错误的)吗?如果对我模拟的依赖项进行了意外的方法调用,有没有办法告诉 mockito 测试失败?

最佳答案

1.

当您 stub 方法调用时,通常不需要验证方法 - 您应该根据返回值检查操作(在您的情况下,可能会发生某些事情,或者当 dateUtilityService 返回 true 时会返回某些东西 - 检查而不是验证与模拟互动。

Mockito 文档也讨论了这一点。 http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#2

2.

这实际上会导致脆弱的测试,并且不推荐使用 mockito 做事的方式。这就是为什么无法设置此行为的原因。

参见 http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#8

关于java - Mockito 与 JMock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24387558/

相关文章:

java - 如何删除XML中的数据并只保留部分数据?

java - Apache Drill 检查目录中文件的结构

java - Wicket - 参数化 StringResourceModel 的奇怪行为

java - 使用 JUnit 进行自动化测试

java - Gradle 找不到 JUnit 测试

php - 如何从 Laravel 正确模拟 Illuminate\Http\Request 类

java - 文档中的单词计数频率

带参数的python模拟函数

python-3.x - 在 python Mock 中向 side_effects 添加额外参数

java - JUnit @Before 与 @Rule