我需要实现以下逻辑:
我使用when
/ then
块进行简单测试。但我真的不知道如何实现更复杂的(如上所述)+我想尽可能多地重用代码。但是使用块,实现起来会变得更加复杂
答案 0 :(得分:2)
我采用了一些方法来重用Spock中的代码。
功能级别 在您的设置中创建一个闭包:块。您可以将其视为仅适用于此功能的方法。
def "test"() {
setup:
def containsCat = {String it -> it.contains('cat')}
expect:
!containsCat('I love my dog')
containsCat('I love my cat')
}
def "test that cannot reference containsCat(String)"() {
// Test stuff
}
Spec Class Level 虽然可以使用@Shared闭包,但我的首选是使用私有帮助器方法,除非辅助逻辑只有一行或两行。
class tester extends Specification {
@Shared
def containsDog = {String it -> it.contains('dog')}
private containsCat(String inputString) {
inputString.contains('cat')
}
def "test"(String myPet) {
expect: containsCat(myPet)
where: myPet = 'I love my cat'
}
def "test2"() {
expect: containsDog(mySistersPet)
where: mySistersPet = 'I love my dog'
}
套餐级别
我有一组可以从共享微型测试框架中受益的课程。我的偏好是使用特征。除了功能测试本身,它们可以保存任何代码。如果特征将引用测试本身内的数据,请确保创建一个抽象方法,以确保特征对数据的引用。
trait petTester {
private containsDog(String inputString) {
inputString.contains('dog')
}
private containsCat(String inputString) {
inputString.contains('cat')
}
}
class myPetTester extends Specification implements petTester {
def "test"(String myPet) {
expect: containsCat(myPet)
where: myPet = 'I love my cat'
}
}
class mySistersPetTester extends Specification implements petTester {
def "test2"() {
expect: containsDog(mySistersPet)
where: mySistersPet = 'I love my dog'
}
}
答案 1 :(得分:0)
您也可以使用interaction { doStuff() }
。
但是,如果您发现doStuff()很大并且您的许多测试都使用相同的交互方法,那么可能是时候考虑将生产类中的某些代码移动到一个单独的类中然后使用一个期望你的被测班级称你的新班级。