在Spock

时间:2015-05-20 09:33:56

标签: json grails 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的方式很有用,因为我想要实现的是测试另一个类的方法,它将产品作为参数并使用它,调用&#34;作为JSON&# 34;在产品执行过程中。由于产品可能很复杂并且有很多依赖关系和字段,我更喜欢模仿它们。 Spock然后控制模拟产品方法的输出,但是当需要转换时会变得更加棘手......

1 个答案:

答案 0 :(得分:1)

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

  1. 复杂的测试是代码气味。他们告诉你“有问题”。试图在气味上涂抹大量除臭剂会让事情变得更糟。
  2. 您正在测试生产中不可能发生的情况。
  3. 干净/更好的解决方案是重构Product,直到它可以轻松创建,你不再需要嘲笑它。根据我对您的具体情况的了解,Product是一个数据对象(如IntegerLongBigDecimal)。它只是编码状态而没有自己的功能。

    如果这是真的,那么在没有嘲笑的情况下创建测试用例应该很简单。如果您需要模拟数据对象,那么您的代码就会出现问题。只有像服务这样的东西才需要模拟 - 代码作用于数据对象,并且具有你需要为测试切割的外部依赖性。

    第二个论点是你正在编写通过但不讲故事的测试。这是一个复杂的形式,有10'000个测试只包含assertTrue(true);。虽然在测试计数方面它是一件好事,但它并没有给你一个优势,而不是没有它们。