Модульный тест Spock на то, что проверка генерирует исключение

#validation #unit-testing #groovy #intellij-idea #spock

#проверка #модульное тестирование #заводной #intellij-idea #spock

Вопрос:

Я новичок в Spock, и у меня есть этот класс, который я хочу протестировать. В классе есть метод, который проверяет продукт. Чтобы пройти проверку, у продукта должна быть полная цена, и она должна содержать все остальные цены, в противном случае должно быть выдано исключение.

 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. Если вы нашли мой ответ полезным, пожалуйста, примите его и поддержите.

Ответ №1:

Вам нужно протестировать несколько случаев, один из которых будет:

 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 класса (строка с >> оператором сдвига вправо). Нет, похоже, он готов к тестированию. Другие сценарии, когда цена заполнена, должны быть протестированы отдельным методом. Есть еще вопросы?

Комментарии:

1. Спасибо. Проблема все еще существует, но теперь я вижу, что с макетом что-то не так: «Невозможно назначить «Объект» «Продукту». Есть идеи, что здесь не так?

2. Хорошо, Mock(Product) тогда попробуйте.

3. И? Как идут дела?

4. Извините за крайне поздний ответ. Я был новичком в Spock и издевался, когда добавлял вопрос. Позже я понял, что мне даже не нужен макет. Итак, в разделе «дано» я просто создал продукт. Продукт продукт = новый продукт (полная цена: новая цена (priceInclVAT: 100, priceExclVAT: 70, НДС: null))

5. Не забывайте всегда завершать процесс задания вопроса в StackOverflow (путем принятия или голосования). Некоторые люди действительно посвящают свое время тому, чтобы помочь Вам или любому другому человеку.