当前位置: 首页 > 知识库问答 >
问题:

简单的Mockito验证在JUnit中有效,但在Spock中无效

太叔鸿
2023-03-14

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

然而,当我在斯波克运行相同的测试时,它失败了。

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)

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

共有2个答案

贝钧
2023-03-14

我有一个用例,要求PowerMockito在Java类中模拟最终方法(Spock mocking不起作用),但还需要验证它们是否被调用,因为最终方法是生成器风格的,并返回“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
仉梓
2023-03-14

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

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

 类似资料:
  • 我正在通过安全连接测试客户端服务器。 我将密钥库证书加载到SOAPUI中,并能够连接到服务器的组件。但是,当我在JMeter v2中配置相同的密钥库证书时。13,我得到了这个错误: 响应代码:非HTTP响应代码:javax。网ssl。SSLHandshakeException响应消息:非HTTP响应消息: 我已经参考了发现的许多建议,并已配置路径到我的密钥库和密码在杰米的system.proper

  • 下一个测试: 并在我的中获取下一个错误: 组织。莫基托。例外。滥用。NotAMockException:传递给verify()的参数是Unit类型,不是模拟!确保正确放置括号!请参阅正确验证的示例:验证(模拟)。somethod();验证(模拟,第10次)。somethod();验证(模拟,至少一次()。somethod();

  • 问题内容: 如上所述,我遇到了@ font-face无法在IE9中显示的问题,尽管它在包括IE8及以下版本的所有其他浏览器中都可以正常显示。此外,在我的计算机上本地查看时,IE9会显示字体,而不会完全显示。 使用的代码是: 任何人都知道为什么会发生这种情况吗? 问题答案: 没有答案,只是确认:我有类似的问题。 字体可以使用IETester和原始浏览器在除IE9之外的所有其他IE版本中使用。更改文档

  • 问题内容: 我想制作一个用C ++编写的服务器来支持我的游戏。我学习了套接字的基础知识,并编写了一个运行良好的基本聊天程序。现在,我想创建一个像Apache这样的HTTP服务器,但是仅用于AJAX请求- 响应部分。 我认为刚开始时,我复制了一个Apache响应文本,并使用C ++服务器程序发送了准确的响应。 问题是浏览器(Firefox)连接到apache,并且一切正常,除了所有请求均得到正确的响

  • 我们的旧系统使用.NET 3.5(运行在Windows Server 2003 32bits上)来验证来自我们客户的电子收据(都使用SHA1RSA算法作为协议)。我们将他们的证书以Base64字符串存储在数据库中。旧代码如下所示: 除了性能不好外,没有其他问题。这就是为什么我们想要转移到使用Java1.7的新系统(运行在Windows Server 2012 64位上)。我们的新代码如下所示: 我

  • 问题内容: 我正在测试具有预期异常的方法。我还需要在引发异常后验证是否在某个模拟对象上调用了一些清除代码,但看起来该验证已被忽略。这是代码。我正在使用Junit 验证预期的异常。 似乎完全被忽略了。无论我采用什么方法,我的测试都通过了,这不是我想要的。 知道为什么会这样吗? 问题答案: 通过将整个测试方法通过JUnit @Rule 包装在try- catch块中来工作。当您的代码引发异常时,它将堆