【问题标题】:Unit test case for Domain class ( testing constraints) - Grails域类的单元测试用例(测试约束) - Grails
【发布时间】:2016-09-07 15:57:49
【问题描述】:

我实际上是 Grails 世界的新手。我正在尝试为有一些约束的域类编写一个测试用例。当我尝试运行单元测试时,我的对象出现空指针异常。在调试时,我知道我的 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
    }
 }

提前致谢。

【问题讨论】:

    标签: grails spock


    【解决方案1】:

    唯一让我印象深刻的是你在 toString() 中的返回。

        return "$miscOrderCharges x$quantity"
    

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

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

        return "${miscOrderCharges * quantity}"
    

    更多信息请参见http://groovy.jmiguel.eu/groovy.codehaus.org/Strings+and+GString.html

    【讨论】:

    • 是的,它们需要相乘,我使用了 astrisk(*) 进行乘法,但仍然无法通过。不过感谢您的回复。欣赏它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2010-11-15
    • 2021-04-08
    相关资源
    最近更新 更多