Domain类的单元测试用例(测试约束) - Grails

时间:2016-09-07 15:57:50

标签: grails spock

我实际上是Grails世界的新人。我正在尝试为具有一些约束的域类编写测试用例。当我尝试运行单元测试时,我的对象上出现Null指针异常。在调试时我知道我的toString方法有一些可疑的东西导致对象设置为Null。我该怎么办?任何帮助都非常感谢。

这是我的域类:

@MultiTenant

class OrderCharge {
    static scaffold = [
        exclude: ['tenantId'],
    ]

    static belongsTo = [
        order: SalesOrder
    ]

    MiscOrderCharges miscOrderCharges
    Date lastUpdated
    double quantity
    double price
    SapInvoiceRecord sapInvoice

    static constraints = {
        order(nullable: true)
        quantity(min:1d)
        miscOrderCharges()
        sapInvoice(nullable: true)
    }

    String toString(){
        def pattern = "\$##,###.00"
        def currency = new DecimalFormat(pattern)
        String rate = currency.format(miscOrderCharges.price)
        return "$miscOrderCharges x$quantity"
    }
}

这是我的单元测试用例:

import grails.test.mixin.TestFor
import spock.lang.Unroll
import spock.lang.Specification
@TestFor(OrderCharge)
//@TestMixin(GroovyPageUnitTestMixin)

class ChargeSpec extends Specification {

    def setup() {
        mockForConstraintsTests(
            OrderCharge, [
                new OrderCharge(order: Mock(SalesOrder),
                    miscOrderCharges: Mock(MiscOrderCharges),
                    quantity: 1.0,
                    price:20.0
                        /*, sapInvoice: Mock(SapInvoiceRecord) */
                )
            ]
        )
    }

    void validateConstraints(obj, field, error) {
        def validated = obj.validate()
        if (error && error != 'valid') {
            assert !validated
            assert obj.errors[field]
            assert error == obj.errors[field]
        } else {
            assert !obj.errors[field]
        }
    }

    @Unroll("test inventory all constraints #field is #error")
    def "test Charge all constraints"() {
        given:
        def obj = new OrderCharge("$field": val)

        expect:
        validateConstraints(obj, field, error)

        where:
        error               |field                 |val
        'nullable'          |'orderCharge'         |null
        'nullable'          |'sapInvoice'          |null
        'min'               |'quantity'            |-1
        'min'               |'price'               |0
    }
 }

提前致谢。

1 个答案:

答案 0 :(得分:0)

唯一突然出现在我身上的是你在toString()中的回归。

    return "$miscOrderCharges x$quantity"

你在那里使用gStrings。我的理解是,可以使用简单的$表示法引用单个变量,如格式 $ somevariable ,而表达式的格式为 $ {expression}

在您的陈述中 x $ quantity 似乎是一个错字。你的意思是将它们乘以如下表达式吗?

    return "${miscOrderCharges * quantity}"

有关详细信息,请参阅http://groovy.jmiguel.eu/groovy.codehaus.org/Strings+and+GString.html