Как сопоставить содержимое коллекции во взаимодействиях Спока?

Учитывая, что у меня есть следующий метод в классе, который я высмеиваю:

class Foo {
   public void doSomething(Collection<String> input) {
     //...
   }
}

Теперь я проверяю этот класс в своем тесте Спока и хочу проверить взаимодействие:

def test() {
    setup:
    def myMock = Mock(Foo)

    when:
    def hashSet = new HashSet<String>(['foo', 'bar'])
    myMock.doSomething(hashSet)

    then:
    1 * myMock.doSomething(['foo', 'bar'])

}

Это взаимодействие, однако, не вызывает. Что действительно странно, так это то, что результат говорит мне:

too few invocations for:

1 * myMock.doSomething(['foo', 'bar'])   (0 invocations)

Unmatched invocations (ordered by similarity):

1 * myMock.doSomething(['foo', 'bar'])

Таким образом, это в основном сказало мне, что не было вызова, похожего на тот, который я ожидал, но был другой, который... ммм был похож на тот, который я ожидал.

Я делаю что-то не так или это ограничение Спока, и мне нужно проверить содержимое коллекции в закрытии, например

1 * mock.doSomething( { it == ['foo', 'bar'] })

1 ответ

Решение

Это все потому, что пример HashSet передается в качестве аргумента для имитации вызова в то время как экземпляр List передается в when блок. [] является ArrayList в Groovy - есть несоответствие типов - но оба Set а также List напечатаны на консоли выглядят очень похоже. Следующий тест работает хорошо:

@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class Test extends Specification {

    def "test"() {
        setup:
        def lol = Mock(Lol)

        when:
        def hashSet = new HashSet<String>(['foo', 'bar'])
        lol.doSomething(hashSet)

        then:
        1 * lol.doSomething(new HashSet<String>(['foo', 'bar']))
    }
}

class Lol {
   public void doSomething(Collection<String> input) {
       println input
   }
}
Другие вопросы по тегам