【问题标题】:@ExpectedException in grails unit testsgrails 单元测试中的@ExpectedException
【发布时间】:2009-12-30 20:59:18
【问题描述】:

有人在 grails 单元测试中使用过这个注解吗? 似乎对我不起作用。 谢谢。 D

更新:下面我的测试的最后一行确实抛出了预期的异常。但是测试失败(堆栈跟踪对于这里来说太大了......)。我正在使用 grails 1.2 并在 eclipse 的 junit runner 中运行测试。也许 grails 使用的是比 4 更早的 junit 版本?

/**
 * Get the EC by a manager of a different company. Should throw exception
 */
@ExpectedException(ServiceAuthorizationException.class)
void testGetEcByNonOwnerManagerOfDifferentCompany() {
    mockDomain(ExpenseClaim , [new ExpenseClaim(id:"1",narrative:"marksClaim", employee:userMark, company:dereksCompany)])      

    def authControl = mockFor(AuthenticateService)
    authControl.demand.userDomain(1..1)  {-> otherUserMgr }
    authControl.demand.ifAllGranted(1..1)  {String arg1 -> return "ROLE_COMPANYMANAGER".equals(arg1) } //returns true
    def testService = new ExpenseClaimService()
    testService.authenticateService = authControl.createMock()
    def thrown = false
    testService.getExpenseClaim("1")
}

【问题讨论】:

  • 你能解释一下“没用”是什么意思吗?
  • 您好约翰,感谢您的帮助。是的,我在那里缺少一些细节......我会添加一个回复,因为我无法将其放入此评论框中。 D
  • 是的,它使用的是 junit 3.4.2。我认为这只适用于junit4。我想这就是答案

标签: unit-testing grails expected-exception


【解决方案1】:

目前仅支持 JUnit 3,因此请改用 shouldFail()

void testGetEcByNonOwnerManagerOfDifferentCompany() {

  shouldFail(ServiceAuthorizationException) {
    mockDomain(ExpenseClaim , [new ExpenseClaim(id:"1",
                               narrative:"marksClaim", employee:userMark,
                               company:dereksCompany)])      

    def authControl = mockFor(AuthenticateService)
    authControl.demand.userDomain(1..1)  {-> otherUserMgr }
    authControl.demand.ifAllGranted(1..1)  {String arg1 ->
       "ROLE_COMPANYMANAGER".equals(arg1) } //returns true
    def testService = new ExpenseClaimService()
    testService.authenticateService = authControl.createMock()
    testService.getExpenseClaim("1")
  }
}

shouldFail() 实际上更方便,因为您可以在每个测试中多次使用它,并且它会返回异常消息,因此您可以根据消息以及异常进行断言。

【讨论】:

  • 这仍然适用于 1.3.7 吗?
  • 从 2.0 开始,您可以使用 JUnit 4,但正如我所说,我仍然会使用 shouldFail,因为它非常灵活。
  • 不要拖钓这个问题,但我发现答案对一个小改动很有帮助。在我看来,您应该只将被测代码包装在 shouldFail(){} 块中。因为如果测试的任何积累失败,这个测试将是绿色的,给你一个误报。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2016-08-23
相关资源
最近更新 更多