首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Simple Mockito verify可以在JUnit中工作,但不能在Spock中工作

Simple Mockito verify可以在JUnit中工作,但不能在Spock中工作
EN

Stack Overflow用户
提问于 2013-05-22 03:38:40
回答 2查看 5.2K关注 0票数 21

使用Mockito's examples page中最基本的示例,我能够在JUnit中成功运行。

但是,当我在Spock中运行相同的测试时,它失败了。

JUnit/版本(这个通过了):

代码语言:javascript
复制
import org.junit.Test;

import java.util.List;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

public class SimpleJunitTest
{
    @Test
    public void basicMockTest()
    {
        List mockedList = mock(List.class);

        //using mock object
        mockedList.add("one");
        mockedList.clear();

        //verification
        verify(mockedList).add("one");
        verify(mockedList).clear();
    }
}

Groovy/版本(失败):

代码语言:javascript
复制
import static org.mockito.Mockito.mock
import static org.mockito.Mockito.verify


class SimpleSpockTest extends spock.lang.Specification
{
    def "Basic Mock Test"()
    {
        given:
            //mock creation
            List mockedList = mock(List.class);

        when:
            //using mock object
            mockedList.add("one");
            mockedList.clear();

        then:
            //verification
            verify(mockedList).add("one");
            verify(mockedList).clear();
    }

}

以下是当Spock测试失败时我得到的错误:

代码语言:javascript
复制
Condition not satisfied:

verify(mockedList).add("one")
|      |           |
|      |           false
|      $java.util.List$$EnhancerByMockitoWithCGLIB$$172e393a@613043d2 (renderer threw    
NullPointerException)
$java.util.List$$EnhancerByMockitoWithCGLIB$$172e393a@613043d2 (renderer threw 
NullPointerException)

at SimpleSpockTest.Basic Mock Test(SimpleSpockTest.groovy:25)

有什么想法或建议吗?我真的很喜欢Spock和Mockito,我希望他们能很好地合作。非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-22 04:00:19

粗略地说,then-block只能包含布尔表达式形式的断言。Mockito验证表达式不适合这个约定,因为当它通过时将返回一个假值(nullfalse0),这被Spock解释为一个失败的断言。

要解决这个问题,您可以编写一个辅助方法来包装验证表达式并始终返回true,或者您可以使用Spock的内置模拟框架来代替Mockito。

票数 24
EN

Stack Overflow用户

发布于 2020-12-04 01:06:27

我有一个用例,要求PowerMockito模拟Java类中的最终方法( Spock模拟将不起作用),但还需要验证它们是否被调用,因为最终方法是构建器风格的,并返回"this",这使得即使模拟的调用没有被调用,测试也会通过。

我的解决方案是将"|| true“附加到我的验证调用中,如下所示:

代码语言:javascript
复制
given:
when(myMock.setSomething("xyzzy")).thenReturn(myMock)

when:
def result = objectBeingTested.isExecutedWith("xyzzy")

then:
result == expectedResult
Mockito.verify(myMock).setSomething("xyzzy") || true         // this passes
Mockito.verify(myMock).setSomething("wrongValue") || true    // this FAILS appropriately
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16678126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档