Unit testing 单元测试使用声明性异常处理的grails控制器

Unit testing 单元测试使用声明性异常处理的grails控制器,unit-testing,grails,Unit Testing,Grails,假设我有以下代码: class SomeController { def fooService def controllerMethod() { def bar = fooService.doSomething() // render bar to user - success case } def fooExceptionHandler(FooException e) { // log, render error

假设我有以下代码:

class SomeController {     
   def fooService

   def controllerMethod() {
       def bar = fooService.doSomething()
       // render bar to user - success case
   }

   def fooExceptionHandler(FooException e) {
       // log, render error page, etc... 
   }
}
基于,如果fooService.doSomething抛出异常,grails将为我调用fooExceptionHandler。太好了

现在,当我对这个方法进行单元测试时,测试类使用@TestForSomeController注释,这将失败,因为我们预期会发生FooException,但没有得到任何结果

@Test(expected=FooException)
def doSomethingThrowsFooException() {
   // override default service behavior, trigger a FooException 
   controller.fooService = [ doSomething: { throw new FooException() }] 
   controller.controllerMethod()
}
然而,这是可行的:

@Test
def doSomethingThrowsFooException() {
   // override default service behavior, trigger a FooException 
   controller.fooService = [ doSomething: { throw new FooException() }] 
   controller.controllerMethod()
   assert response.json == false
}

因此,测试此方法的唯一方法是断言响应是预期的,但由于声明性异常处理,现在在其他地方单独测试此逻辑,而不是在我正在测试的代码单元中。我的单元测试不应该只验证异常是从控制器方法传播出去的吗?

如果可能的话,我会在集成测试中测试fooService与控制器的集成,但我认为这只有在功能测试中才能真正合理地测试。你真的在测试Grails——你在验证你的应用程序中是否发生了记录在案的行为

如果您添加一些代码来抛出异常,然后添加额外的代码来捕获异常并将其路由到处理程序,那么您只是在模仿Grails提供的东西。这方面的测试只是测试模拟代码,但与代码在生产环境中的工作情况无关


这里的单元测试机会在fooExceptionHandler中。如果出现异常,请进行测试,这样做是正确的。

让我看看我是否理解。在声明性异常处理之前,我的控制器在服务调用周围放置了一个try/catch,并在catch中呈现了错误页面。既然不需要try/catch,您是说我根本不需要对这条路径进行单元测试吗?我确实理解你所说的单元测试fooExceptionHandler