Spock单元测试验证抛出异常

时间:2014-06-24 11:32:18

标签: validation unit-testing groovy intellij-idea spock

我是Spock的新手,我有这个课,我想进行单元测试。在课堂上有一种验证产品的方法。要通过验证,产品必须具有fullPrice,并且必须包含所有其他价格,否则应抛出异常。

class PriceValidator {
    private final Logger logger = Logger.getLogger(MyService.class)

    void validate (Product product) throws SubsystemException {

        if (!product.fullPrice || !product.fullPrice.priceInclVAT || !product.fullPrice.priceExclVAT || !product.fullPrice.vat) {
            String message = "No price found!"
            logger.error(message)
            throw new SubsystemException(
                    Subsystem.MySystem,
                    FailureCause.NO_PRICE_FOUND,
                    message
            )
        }
    }
}

我已经尝试过几种方式测试,没有任何运气。我猜我需要嘲笑,但这对我来说也是新的。这是我尝试过的一个测试示例,导致“测试框架意外退出”(并且所有价格都是字符串):

class PriceValidatorTest extends Specification {

    @Unroll
    def "No price should throw an exception"() {
        given:
        PriceValidator priceValidator = new PriceValidator()
        Product product = Mock()

        when:
        product.fullPrice != null
        product.fullPrice.priceInclVAT = "100"
        product.fullPrice.priceExclVAT = "70"
        product.fullPrice.vat = null
        priceValidator.validate(product)

        then:
        thrown(SubsystemException)
    }
}

有人建议如何测试PriceValidator吗?

1 个答案:

答案 0 :(得分:0)

你需要测试几个案例,其中一个案例是:

def "No price should throw an exception"() {
    given:
    PriceValidator priceValidator = new PriceValidator()
    Product product = Mock() {
        getFullPrice() >> null
    }

    when:
    priceValidator.validate(product)

    then:
    thrown(SubsystemException)
}

您需要做的是模拟 Product类(带>> rightShift运算符的行)的行为。似乎没有准备好接受测试。其他情况,当价格填补时,应采用单独的方法进行测试。还有其他问题吗?