我模拟的对象之一必须转换为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
是一个数据对象(例如Integer
,Long
和BigDecimal
)。它只是对状态进行编码而没有太多功能。如果是这样,那么创建测试用例而不进行模拟应该很简单。如果您需要模拟数据对象,那么您的代码有问题。只有服务之类的东西才需要进行模拟-这些代码作用于数据对象,并且具有外部依赖关系,您需要进行剪切以进行测试。
第二个论点是您正在编写通过但不讲故事的测试。这是一种复杂的形式,只有10万个测试仅包含
assertTrue(true);
。尽管在测试数量方面是一件好事,但与完全没有它们相比,它并没有给您带来任何优势。关于json - 在Spock中将模拟转换为JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30345805/