在 Spock 中将模拟转换为 JSON

Converting a mock to JSON in Spock

我模拟的对象之一必须转换为 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 的方式很有用,因为我想要实现的是测试另一个 class 的方法,该方法将产品作为参数并使用它,在执行期间对产品调用 "as JSON"。由于产品可能很复杂并且有很多依赖项和字段,所以我更喜欢模拟它们。然后 Spock 控制模拟产品方法的输出,但在需要转换时会变得更加棘手...

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

  1. 复杂的测试是一种代码味道。他们告诉你 "something is wrong"。尝试在气味上涂抹大量除臭剂会使事情变得更糟。
  2. 您正在测试生产环境中无法发生的场景。

clean/better 解决方案是重构 Product 直到它可以轻松创建并且您不再需要模拟它。根据我对您的具体情况的了解,Product 是一个数据对象(如 IntegerLongBigDecimal)。它只是对状态进行编码,没有太多自己的功能。

如果那是真的,那么无需模拟就可以轻松创建测试用例。如果您需要模拟数据对象,那么您的代码有问题。只有服务之类的东西才需要模拟 - 代码作用于数据对象并且具有外部依赖性,您需要为测试削减这些依赖性。

第二个论点是您编写的测试通过了但没有讲述任何故事。这是一种复杂的形式,有 10'000 个测试只包含 assertTrue(true);。虽然就测试计数而言这是一件好事,但与根本没有测试相比,它并没有给你带来任何优势。