我模拟的对象之一必须转换为JSON,但Spock似乎不支持转换的模拟。如何选择要返回的JSON?

我想要实现的示例:

def "convert as JSON"()
{
    when:
    def product = Mock(Product)
    println(product as JSON)
    then:
    1* (product as JSON) << (["message": "message"] as JSON)
}

但是,这不起作用。

编辑:模拟将对象转换为JSON的方式很有用,因为我要实现的是测试另一个类的方法,该方法将产品作为参数并使用它,并在执行过程中在产品上调用“as JSON” 。由于产品可能很复杂,并且具有很多依赖项和字段,因此我更喜欢模拟它们。然后,Spock可以控制模拟产品方法的输出,但是当需要转换时,它将变得更加棘手。

最佳答案

在测试中,您试图降低对象(Product)的复杂性,以使测试更简单。这很危险,原因有两个:

  • 复杂的测试是代码的味道。他们告诉您“出了点问题”。尝试在气味上使用大量除臭剂会使情况更糟。
  • 您正在测试在生产中不会发生的方案。

  • 干净/更好的解决方案是重构Product,直到可以轻松创建它,而您不再需要对其进行模拟。据我对您的特定情况的了解,Product是一个数据对象(例如IntegerLongBigDecimal)。它只是对状态进行编码而没有太多功能。

    如果是这样,那么创建测试用例而不进行模拟应该很简单。如果您需要模拟数据对象,那么您的代码有问题。只有服务之类的东西才需要进行模拟-这些代码作用于数据对象,并且具有外部依赖关系,您需要进行剪切以进行测试。

    第二个论点是您正在编写通过但不讲故事的测试。这是一种复杂的形式,只有10万个测试仅包含assertTrue(true);。尽管在测试数量方面是一件好事,但与完全没有它们相比,它并没有给您带来任何优势。

    关于json - 在Spock中将模拟转换为JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30345805/

    10-12 12:39
    查看更多