2009-12-30 88 views
6

任何人在grails单元测试中使用这个注解? Didnt似乎为我工作。 谢谢。 DGrails单元测试中的@ExpectedException

更新:我的测试下面的最后一行确实会抛出预期的异常。然而,测试失败(堆栈跟踪太大,这里...)。我使用grails 1.2并在eclipse的junit runner中运行测试。也许grails使用的是早于版本的junit而不是4?只有

/** 
* 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") 
} 
+2

你能解释一下你的意思是“没有工作”吗? –

+0

嗨John, 感谢您的帮助。是的,我在那里缺乏一些细节.... 我会添加一个答复,因为我不能适应它在这个评论框。 D – Derek

+0

啊是的,它使用junit 3.4.2。我认为这只适用于junit4。我认为这是答案 – Derek

回答

17

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

谢谢Burt!作品完美。 – Derek

+0

从1.3.7开始仍然适用? – dbrin

+1

从2.0开始,您可以使用JUnit 4,但正如我所说的,由于它非常灵活,我仍然会使用shouldFail。 –