2009-12-30 5 views
6

Кто-нибудь использовал эту аннотацию в модульных тестах Grail? Кажется, я не работал для меня. Спасибо. D@ExpectedException в модульных тестах grails

Обновление: последняя строка моего теста ниже бросает ожидаемое исключение. Однако тест терпит неудачу (трассировка стека слишком велика для здесь ...). Я использую grails 1.2 и запускаю тест в junit runner eclipse. Возможно, 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

Hi 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

Спасибо, Берт! работает отлично. – Derek

+0

это все еще применимо с 1.3.7? – dbrin

+1

Начиная с версии 2.0 вы можете использовать JUnit 4, но, как я уже сказал, я все равно буду использовать shouldFail, поскольку он настолько гибкий. –