Как сопоставить содержимое коллекции во взаимодействиях Спока?
Учитывая, что у меня есть следующий метод в классе, который я высмеиваю:
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
}
}