2009-12-30 3 views
6

Hat jemand diese Annotation in Grails Unit Tests verwendet? schien nicht für mich zu arbeiten. Danke. D@ExpectedException in Grails-Unit-Tests

Update: Die letzte Zeile meines Tests unten wirft die erwartete Ausnahme. Der Test schlägt jedoch fehl (Stack-Trace zu groß für hier ...). Ich verwende Grails 1.2 und führe den Test in Eclipse's Junit Runner durch. Vielleicht benutzt Grails eine frühere Version von Junit als 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

Können Sie erklären, was Sie mit "nicht funktioniert" meinen? –

+0

Hallo John, Danke für die Hilfe. Ja, mir fehlt ein bisschen Detail .... Ich füge eine Antwort hinzu, da ich es nicht in dieses Kommentarfeld einfügen kann. D – Derek

+0

Ah ja es mit Junit 3.4.2. Ich denke, das funktioniert nur mit junit4. Ich denke, das ist die Antwort – Derek

Antwort

17

Nur JUnit 3 wird derzeit unterstützt, verwenden Sie so shouldFail() statt:

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() tatsächlich bequemer ist, da Sie es mehr als einmal pro Test verwenden können, und es gibt die Ausnahmemeldung, so dass Sie kann basierend auf der Nachricht sowie der Ausnahme geltend machen.

+1

Danke Burt! funktioniert perfekt. – Derek

+0

gilt dies noch ab 1.3.7? – dbrin

+1

Ab 2.0 können Sie JUnit 4 verwenden, aber wie gesagt, ich würde immer noch sotfail verwenden, da es so flexibel ist. –