嗨我正在进行这样的控制器操作,我希望在Grails的Spock Controllers Unit测试的帮助下测试我的动作的catch块
class AbcController{
def tst(Long id) {
Abc abc = Abc.get(id)
try{
................
println "Try block"
..................
}
catch(DataIntegrityViolationException e){
........
println "Catch block"
........
}
}
}
我的测试用例就像。
@TestFor(AbcController)
@Mock([Abc])
class AbcControllerSpec extends Specification {
void 'Test action catch block'() {
setup:
params.id = 1
when:
controller.tst()
then:
thrown DataIntegrityViolationException
expect:
1==1
}
}
但Catch块代码根本没有执行,请帮助我这样做。
答案 0 :(得分:3)
您需要在测试用例中抛出异常。你可能会这样(未经测试):
@TestFor(AbcController)
@Mock([Abc])
class AbcControllerSpec extends Specification {
void 'Test action catch block'() {
setup:
this.metaClass.println = { Object value ->
throw new DataIntegrityViolationException()
}
and:
params.id = 1
when:
controller.tst()
then:
DataIntegrityViolationException dive = thrown()
}
}
答案 1 :(得分:0)
如果您正在测试DataIntegrityViolationException
,则表示您必须插入并更新try
块中的某些记录。
要测试catch
阻止,您需要一个在插入或更新记录时违反其中一个数据库约束的测试用例。
例如插入包含重复主键的记录。