Я получаю странные результаты от теста Spock unit, который я назвал мыслью было вызвано неправильным использованием аннотации Groovy's TupleConstructor
. Однако, благодаря помощи другого пользователя, я вижу, что это проблема с тем, как Spock создает mocks. Хотя я исправил проблему, заменив инъецированные mocks на реальные экземпляры, мне нужно фактически заставить насмехаться над этим.Spock Mock не работает для модульного теста
Мои основные классы:
@Canonical
@TupleConstructor(callSuper = true)
abstract class Vehicle {
Long id
}
@Canonical
@TupleConstructor(callSuper = true, includeSuperProperties = true)
abstract class Foobaz extends Vehicle {
String name
String label
String description
}
@Canonical
@TupleConstructor(callSuper = true, includeSuperProperties = true)
class Fizz extends Foobaz {
// This is an empty class that creates a meaningful name over the
// abstract Foobaz parent class. This may seem like bad design in
// this analogy, but I assure you it makes sense (from a Domain-Driven
// Design perspective) in my actual application.
}
@Canonical
@TupleConstructor(callSuper = true, includeSuperProperties = true)
class Car extends Vehicle {
Fizz fizz1
Fizz fizz2
@Override
String toString() {
"${fizz1.name} - ${fizz2.name}"
}
}
Мой Спок тест:
class CarSpec extends Specification {
def "toString() generates a correct string"() {
given: "a Car with some mocked dependencies"
String f1 = 'fizzy'
String f2 = 'buzzy'
Fizz fizz1 = Mock(Fizz)
Fizz fizz2 = Mock(Fizz)
fizz1.name >> f1
fizz2.name >> f2
Car car = new Car(1L, fizz1, fizz2)
when: "we call toString()"
String str = car.toString()
then: "we get a correctly formatted string"
"${f1} - ${f2}" == str
}
}
Но когда я запускаю это я получаю отказ/ошибка:
Condition not satisfied:
"${f1} - ${f2}" == str
| | | |
fizzy buzzy | null - null
false
<omitting details here for brevity>
Expected :null - null
Actual :fizzy - buzzy
Любые идеи, где я «Не так ли?
Вы не предоставили класс Fizz. Я тестировал ваш пример с помощью простого интерфейса Fizz, и он работает –
Спасибо @ JérémieB (+1) - я буду включать 'Fizz', если вы * абсолютно * считаете его необходимым, но так как они вводятся как Mocks, почему они имеют значение? – smeeb
Вероятно, вы издеваетесь над fizz, что является причиной вашей ошибки. с 'Fizz {String getName()}', ваш пример работает. Так что это не связано с '@ TupleConstructor' –