当前位置: 首页 > 面试题库 >

Spock中最终类的模拟实例在测试和开发代码中的行为有所不同

郎经纶
2023-03-14
问题内容

在我的JavaFX应用程序中,我正在使用Spock和Groovy进行测试。我一直致力于WebBrowserController照顾我的JavafX
WebView组件。我想测试一些功能,这些功能取决于的当前位置和文档WebView

WebBrowserController的相关部分:

public WebEngine getEngine() {
    return panel.getWebView().getEngine();
}

这就是我WebBrowserController为测试创建实例的方式。请注意,GroovyMock我在这里使用的-
普通语言Mock(...)不适用于最终课程,WebEngine而是最终课程。

WebBrowserController getMockedControllerWithDocument(Document document) {
    WebBrowserController controller = Mock(WebBrowserController)
    controller.getEngine() >> GroovyMock(WebEngine) {
        getDocument() >> document
        getLocation() >> "some random string"
    }

    controller
}

下面的行正在测试中,并且中断。我希望返回“一些随机字符串”,但我只是通过了失败的测试和NPE。

String url = controller.get().getEngine().getLocation()

现在,有趣的部分-我WebEngine在两个地方检查了实例-
在结尾处getMockedControllerWithDocument和上面粘贴的行。我发现它引用了相同的对象。但是,当我在测试代码之外调用任何存根方法时,我被NPE击中-
getLocation()执行实际的实现而不是存根(原始方法不仅是简单的getter,而且使用介于两者之间的包装值)。

总结:为什么完全相同的对象在行为上会因调用方法的位置不同而不同?


问题答案:

因为GroovyMockGroovySpy并且GroovyStub仅对Groovy类起作用。当被Java类调用时,它们的行为类似于普通的Spock模拟。这是记录在这里:

小费

什么时候应该把Groovy的嘲弄胜过常规的嘲弄?当规范下的代码用Groovy编写并且需要某些独特的Groovy模拟功能时,应使用Groovy模拟。
当从Java代码调用时,Groovy模拟将表现得像常规模拟一样。

请注意,仅因为规范和/或模拟类型下的代码是用Groovy编写的,所以不必使用Groovy模拟。除非有具体的理由使用Groovy模拟,否则最好选择常规模拟。



 类似资料:
  • 在我的JavaFX应用程序中,我使用Spock和Groovy进行测试。我有专门的来处理我的JavafX组件。我想测试一些依赖于当前位置和文档的功能。 WebBrowserController的相关部分: 这就是我为测试创建实例的方法。注意我在这里使用的-普通不适用于final类,而是final类。 下面的线正在测试中,它断了。我希望“一些随机字符串”返回,但我只是得到失败的测试和NPE。 现在,有

  • 对于测试证据,我想将我写到特定目录中的所有测试工件(例如服务器调用和响应)存档。我得到了压缩目录的方法,但我没有找到合适的地方来执行它。 测试生命周期回调似乎不是正确的位置,因为@AfterAll在每个测试类之后被调用,但是存档应该在所有测试类中的所有测试终止后生成。 在阅读了诸如如何在模块中执行之前和之后分别编码一次的帖子之后?似乎没有希望在jUnit中执行调用。 我找到了一个扩展TestLau

  • Spock对存根和模拟做了很强的区分。当要更改的内容从被测试类使用的类返回时,请使用存根,这样您就可以测试if语句的另一个分支。使用mock,当您不关心测试中的类返回什么时,只需调用另一个类的另一个方法,并且您希望确保调用了该方法。很整洁。然而,假设您有一个具有流利API的构建器,它使人们。您希望测试调用此生成器的方法。 所以最初,我想只是模拟构建器,然后myMethod()的单元测试应该检查具有

  • 在运行spock测试时,我需要帮助模拟一个类及其从yaml文件获得的数据。我有一个用groovy编写的microservice,它根据yaml文件中的字段名参数进行字段映射。 我有一个projectProperties类,它从yaml文件中提取数据。 这个类将从 /src/main/resourcesapplication.yaml文件中提取变量值 当我运行spock测试时,它无法从project

  • null 第一个类如下所示: 我试图为这个类编写一个Spock测试,该类依赖于。我正在考虑模拟类,以便单独测试类。 正在调用的方法,该方法依赖于另一个私有方法。该方法将使用获取实际查询结果。这就是我的Spock测试的样子: null

  • 我有一个在kotlin的‘基地’项目配置与gradle DSL。在基我有模块'app'和模块'library'。模块应用程序使用模块库。我想从模块应用程序的测试(准确地说是库的testUtils包)访问模块库的测试。 我还检查了代码所在的问题: 我需要在库的源代码中添加,这样在应用程序的测试中,我就可以使用库的测试包,而在应用程序的源代码中,我就不能使用库的测试了。 谢谢你。