如何在Spock单元测试Grails中测试catch块代码

时间:2015-03-12 10:55:43

标签: unit-testing grails groovy spock

嗨我正在进行这样的控制器操作,我希望在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块代码根本没有执行,请帮助我这样做。

2 个答案:

答案 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阻止,您需要一个在插入或更新记录时违反其中一个数据库约束的测试用例。

例如插入包含重复主键的记录。