如何在 Spock 单元测试 Grails 中测试 catch 块代码
How to test the catch block code in Spock unit test Grails
您好,我正在执行这样的控制器操作,我想借助 Grails 中的 Spock 控制器单元测试来测试我的操作 tst 的 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 块代码根本没有执行,请帮助我这样做。
如果您正在测试 DataIntegrityViolationException
,则意味着您必须在 try
块中插入和更新一些记录。
要测试 catch
块,您需要一个在插入或更新记录时违反数据库约束之一的测试用例。
例如插入具有重复主键的记录。
您需要在测试用例中抛出异常。你可以这样(未测试):
@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()
}
}
您好,我正在执行这样的控制器操作,我想借助 Grails 中的 Spock 控制器单元测试来测试我的操作 tst 的 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 块代码根本没有执行,请帮助我这样做。
如果您正在测试 DataIntegrityViolationException
,则意味着您必须在 try
块中插入和更新一些记录。
要测试 catch
块,您需要一个在插入或更新记录时违反数据库约束之一的测试用例。
例如插入具有重复主键的记录。
您需要在测试用例中抛出异常。你可以这样(未测试):
@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()
}
}