如何在 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()
  }
}