简单的Mockito验证在JUnit中工作,但在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();
    }
}

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

这是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)

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

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

要解决这个问题,您可以编写一个helper方法来封装验证表达式并始终返回true,或者您可以使用Spock的内置mock框架而不是Mockito。

我有一个用例,要求powermockit模拟Java类中的final方法(Spock mock不起作用),但也需要验证它们是否被调用,因为final方法是构建器样式的,并返回&;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

相关内容

  • 没有找到相关文章

最新更新