#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 (путем принятия или голосования). Некоторые люди действительно посвящают свое время тому, чтобы помочь Вам или любому другому человеку.