简单的Mockito验证适用于JUnit,但不适用于Spock

Phi*_*enn 18 java groovy junit mockito spock

使用Mockito示例页面中最基本的示例,我能够在JUnit中成功运行.

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

JUnit/Java版本(通过):

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Spock/Groovy版本(失败):

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我在Spock测试失败时得到的错误:

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)
Run Code Online (Sandbox Code Playgroud)

任何想法或建议?我真的很喜欢Spock和Mockito,我希望能让他们在一起工作.非常感谢你!

Pet*_*ser 21

粗略地说,then-block只能包含布尔表达式形式的断言.甲验证的Mockito表达不适合这项合同,因为它会返回一个falsy值(null,false,0),当它通过时,这被解释为通过斯波克失败的断言.

要解决这个问题,您可以编写一个包装验证表达式并始终返回的辅助方法,true也可以使用Spock的内置模拟框架而不是Mockito.

  • 我会在一段时间后回到这里,因为我需要模拟一些Spring组件,但仍然不能用Spock模拟做到这一点,我发现`Mockito.verify(mock).foo(bar) || true`对我来说很好,而且相当可读. (11认同)