Spock 框架:间谍问题
Spock Framework: problems with spying
我在 Spock 中使用 Spy 时遇到问题,它要么无法正常工作,要么我的理解有误,所以我想澄清一下。
考虑这段代码 (Java):
public class CallingClass {
public String functionOne() {
//does stuff
return "one";
}
public String functionTwo() {
String one = functionOne();
return "some string " + one;
}
}
现在我想测试 functionTwo
调用 functionOne
以及从 functionOne
定义 returned 值的事实(假设 functionOne
真的很复杂,我不想在我的测试中执行它只是想存根并将它设置为 return 某个特定值)。为此,我在 Groovy 中编写了以下测试(使用 Spock):
class CallingClassTest extends Specification {
def "check that functionTwo calls functionOne"() {
def c = Spy(CallingClass)
c.functionOne() >> "mocked function return"
when:
def s = c.functionTwo()
then:
1 * c.functionOne()
s == "some string mocked function return"
}
}
为了做这样的事情,Spock 要求我拥有 cglib
库,所以我的构建文件(在 Gradle 中)看起来像这样:
apply plugin: 'groovy'
repositories {
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy:latest.release'
testCompile 'org.spockframework:spock-core:latest.release'
testCompile 'junit:junit:latest.release'
testCompile 'cglib:cglib-nodep:latest.release'
}
现在,当我 运行 测试时,我希望 functionOne
根本不会被调用,而是使用我的存根版本。相反,我得到这个:
Condition not satisfied:
s == "some string mocked function return"
| |
| false
| 19 differences (44% similarity)
| some string (-)o(-------)n(-------)e(----)
| some string (m)o(cked fu)n(ction r)e(turn)
some string one
Condition not satisfied:
s == "some string mocked function return"
| |
| false
| 19 differences (44% similarity)
| some string (-)o(-------)n(-------)e(----)
| some string (m)o(cked fu)n(ction r)e(turn)
some string one
at CallingClassTest.check that functionTwo calls functionOne(CallingClassTest.groovy:17)
更重要的是,如果我调试它并在 functionOne
中设置断点,它会被调用 :(
我错过了什么?我的测试不应该使用提供的存根 functionOne
而只是 return 字符串 "mocked function return"
?
应该是:
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')
import spock.lang.*
class CallingClassTest extends Specification {
def "check that functionTwo calls functionOne"() {
def c = Spy(CallingClass)
when:
def s = c.functionTwo()
then:
1 * c.functionOne() >> "mocked function return"
s == "some string mocked function return"
}
}
public class CallingClass {
public String functionOne() {
"one"
}
public String functionTwo() {
String one = functionOne()
"some string $one"
}
}
当您 spy/mock 并验证这是 return 值的指定方式时。
我在 Spock 中使用 Spy 时遇到问题,它要么无法正常工作,要么我的理解有误,所以我想澄清一下。 考虑这段代码 (Java):
public class CallingClass {
public String functionOne() {
//does stuff
return "one";
}
public String functionTwo() {
String one = functionOne();
return "some string " + one;
}
}
现在我想测试 functionTwo
调用 functionOne
以及从 functionOne
定义 returned 值的事实(假设 functionOne
真的很复杂,我不想在我的测试中执行它只是想存根并将它设置为 return 某个特定值)。为此,我在 Groovy 中编写了以下测试(使用 Spock):
class CallingClassTest extends Specification {
def "check that functionTwo calls functionOne"() {
def c = Spy(CallingClass)
c.functionOne() >> "mocked function return"
when:
def s = c.functionTwo()
then:
1 * c.functionOne()
s == "some string mocked function return"
}
}
为了做这样的事情,Spock 要求我拥有 cglib
库,所以我的构建文件(在 Gradle 中)看起来像这样:
apply plugin: 'groovy'
repositories {
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy:latest.release'
testCompile 'org.spockframework:spock-core:latest.release'
testCompile 'junit:junit:latest.release'
testCompile 'cglib:cglib-nodep:latest.release'
}
现在,当我 运行 测试时,我希望 functionOne
根本不会被调用,而是使用我的存根版本。相反,我得到这个:
Condition not satisfied:
s == "some string mocked function return"
| |
| false
| 19 differences (44% similarity)
| some string (-)o(-------)n(-------)e(----)
| some string (m)o(cked fu)n(ction r)e(turn)
some string one
Condition not satisfied:
s == "some string mocked function return"
| |
| false
| 19 differences (44% similarity)
| some string (-)o(-------)n(-------)e(----)
| some string (m)o(cked fu)n(ction r)e(turn)
some string one
at CallingClassTest.check that functionTwo calls functionOne(CallingClassTest.groovy:17)
更重要的是,如果我调试它并在 functionOne
中设置断点,它会被调用 :(
我错过了什么?我的测试不应该使用提供的存根 functionOne
而只是 return 字符串 "mocked function return"
?
应该是:
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')
import spock.lang.*
class CallingClassTest extends Specification {
def "check that functionTwo calls functionOne"() {
def c = Spy(CallingClass)
when:
def s = c.functionTwo()
then:
1 * c.functionOne() >> "mocked function return"
s == "some string mocked function return"
}
}
public class CallingClass {
public String functionOne() {
"one"
}
public String functionTwo() {
String one = functionOne()
"some string $one"
}
}
当您 spy/mock 并验证这是 return 值的指定方式时。