2

単体テストで例外のスローをテストしようとしています。delete メソッドをメタクラス化しようとしましたが、固執したくありません。コードから私が間違っていることを教えてもらえますか?

単体テスト コード:

@TestFor(ProductController)
@TestMixin(DomainClassUnitTestMixin)
class ProductControllerTests {     
  void testDeleteWithException() {
    mockDomain(Product, [[id: 1, name: "Test Product"]])
    Product.metaClass.delete = {-> throw new DataIntegrityViolationException("I'm an       exception")}
    controller.delete(1)
    assertEquals(view, '/show/edit')
}

コントローラ アクション コード:

def delete(Long id) {
    def productInstance = Product.get(id)
    if (!productInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'product.label', default: 'Product'), id])
        redirect(action: "list")
        return
    }

    try {
        productInstance.delete(flush: true)
        flash.message = message(code: 'default.deleted.message', args: [message(code: 'product.label', default: 'Product'), id])
        redirect(action: "list")
    }
    catch (DataIntegrityViolationException e) {
        flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'product.label', default: 'Product'), id])
        redirect(action: "show", id: id)
    }
}    

テストを実行すると、productInstance.delete(flush: true)予期した例外がスローされません。代わりに にリダイレクトしaction: "list"ます。Product.delete() メソッドをオーバーライドして例外を強制できるようにする方法を知っている人はいますか?

4

1 に答える 1

7

delete引数なしでモックしていますが、コントローラーは を呼び出しますdelete(flush: true)delete(Map)次のようにモックアウトしてみてください。

Product.metaClass.delete = { Map params -> 
    throw new DataIntegrityViolationException("...")
}
于 2012-08-22T19:50:58.253 に答える