простой тестовый метод с помощью спока - PullRequest
0 голосов
/ 13 февраля 2019

Мне нужно протестировать следующий метод:

class Person {

    String getFileName(String number) {
         return "file"+number
    }

    void updateSpec(String number) {
         new File(getFileName(number)).delete()
    }
}

Я пытаюсь создать тестовый пример следующим образом:

def "update spec"() {
        given:
            Person person = new Person()

        when:
            person.updateSpec('1')

        then:
            1 * File.delete()
    }

там написано:

Too few invocations for:

1 * File.delete()   (0 invocations)

в чем проблема и как ее исправить, спасибо!

И есть ли хороший способ проверить этот метод?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы можете определить только взаимодействия между объектом по спецификации и его ложными зависимостями.Однако в вашем примере вы «указываете» взаимодействие с классом File, а не с фиктивным объектом.См. Спок, основанный на взаимодействии .Технически, вы можете достичь / изменить свою цель, как предложено в ответе @cgrim.Или вы можете использовать такие инструменты, как PowerMock (без Спока), чтобы высмеивать почти все, кроме ПОМНИТЕ, этот вид техники следует рассматривать только как последнее средство.По сути, если вы придерживаетесь лучших методов проектирования, вам никогда не понадобятся такие инструменты.Если вам не нужно иметь дело с каким-то устаревшим кодом

0 голосов
/ 13 февраля 2019

Зависит от того, что вы хотите проверить.Сначала вы должны использовать Mock или Spy, чтобы иметь возможность проверить количество вызовов.

Например, вы можете проверить, был ли вызван метод getFileName() из метода updateSpec() и вызван ли он с аргументом '1', например:

def "update spec"() {
    given:
    Person person = Spy(Person)

    when:
    person.updateSpec('1')

    then:
    1 * person.getFileName('1')
}

Если вам действительно нужнопроверьте, был ли вызван File.delete(), тогда лучше немного поменять класс Person, потому что вам нужно File макет, на котором вы можете проверить счетчик вызовов:

class Person {
    File getFile(String number) {
        return new File("file" + number)
    }

    void updateSpec(String number) {
        getFile(number).delete()
    }
}

ИЗатем можно выполнить тест:

def "File delete was called"() {
    given:
    File file = Mock(File)
    Person person = Spy(Person)
    person.getFile(_) >> file

    when:
    person.updateSpec('1')

    then:
    1 * file.delete()
}

Другой вариант будет заключаться в том, чтобы внедрить некоторый FileService, который будет инкапсулировать метод File.delete(), в класс Person и проверить его на нем.

...