Simple Mockito 验证在 JUnit 中有效,但不能在 Spock 中工作

2022-09-01 23:24:58

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

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

}

以下是斯波克测试失败时我遇到的错误:

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)

任何想法或建议?我真的很喜欢斯波克和莫基托,希望他们能很好地合作。谢谢!


答案 1

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

要解决此问题,您可以编写一个围绕验证表达式并始终返回的帮助器方法,也可以使用Spock的内置模拟框架而不是Mockito。true


答案 2

我有一个用例,要求PowerMockito模拟Java类中的最终方法(Spock模拟不起作用),但也需要验证它们是否被调用,因为最终方法是生成器样式并返回“this”,这使得测试通过,即使模拟的调用没有被调用。

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

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

推荐