我试图在Spock中使用{throw new Exception()},但是在运行测试时,它会打印在报告中-
”发生了以下问题: 类型为“ java.lang.Exception”的预期异常,但未引发任何异常”
package testing
import spock.lang.Specification
class MyFirstSpec extends Specification {
def "Test_One" (){
given:
def obj = new SpockMethodsPlaceholder()
obj.returnAge(0) >> {throw new Exception("invalidAge")}
when:
1*obj.returnAge(0)
then:
Exception ex = thrown()
ex.getMessage() == "invalidAge"
}
class SpockMethodsPlaceholder {
def "returnAge" (int age){
return age
}
}
}
我的代码有问题吗?
下面是测试运行的堆栈跟踪---
工作目录: Gradle用户主页:/home/mafia/.gradle Gradle分发:来自目标构建的Gradle包装器 摇篮版本:4.3 Java主页:/ usr / lib / jvm / java-8-oracle JVM参数:无 程序参数:无 启用构建扫描:false 启用脱机模式:false 测试:testing.MyFirstSpec
:compileJava更新日期 :compileGroovy NO-SOURCE :processResources NO-SOURCE :UPS-TO-DATE :compileTestJava :compileTestGroovy :processTestResources NO-SOURCE :testClasses :test
testing.MyFirstSpec> Test_One失败 MyFirstSpec.groovy:16上的org.spockframework.runtime.WrongExceptionThrownError
1个测试完成,1个失败 测试失败。请参见以下报告:file:///media/mafia/A08200E98200C62E/Study/Git_Repo/GIT_JAVA/workbench/SpockProject/build/reports/tests/test/index.html
19s成功建成 4个可执行的任务:3个已执行,1个是最新的
答案 0 :(得分:1)
您似乎误解了存根/模拟的概念
到底要测试什么?类SpockMethodPlaceholder
?在这种情况下,不应对其进行“测试中的类”的模拟/添加-您检查并希望对其起作用的代码(如果需要,可以使用此类方法中的代码)
另一方面,如果您使用>>
语法,则可能确实想存根。
所以这是一个更好的例子:
public class SomeClass {
public int return getAge(int age) {
if(age <= 0) {
throw new IllegalArgumentException("too young");
} else {
return age;
}
}
}
class SomeClassTest extends Specification {
def "an exception is thrown if the person is too young" () {
given:
def subject = new SomeClass()
when:
subject.getAge(-1)
then:
def ex = thrown(IllegalArgumentException)
ex.message == "too young"
}
}