2016-07-08 1 views
3

Поток начинается с Controller.callMethod(). Он вызывает метод, который вызывает MyException. MyException обрабатывается обработчиком исключений написанного в контроллере:Как проверить предложение бросков в классе, который должен быть проверен с использованием Mockito

public class Controller{ 

public Response callMethod() throws MyException { 

    ClassToTest classToTest = new ClassToTest(); 
    return(classToTest.method()); 
    } 


@ExceptionHandler(MyException.class) 
public @ResponseBody 
Response myException(HttpServletRequest req, 
     HttpServletResponse res, MyException myException) { 

    Response response = new Response(); 
    response.setResponseCode(myException.getErrorCode());  
    return response; 
} 

} 


public class ClassToTest { 
    public Response method() throws MyException { 
     Response response = anotherMethod(); 
     return response; 
    } 


    public String anotherMethod(){ 
     if(//something) 
      throw new MyException(Constant.ERROR_CODE); // I need to test this line 
    else 
     return //some response 
    } 
} 


} 

Это мой тест класс:

public class Test { 

@Test 
public void testMethod(){ 
try{ 
    ClassToTest classtotest = new ClassToTest(); 
    Response response = classtotest.method(); //I want to get response after getting MyException (Response created by the myException ExceptionHandler) 
    assertEquals("SUCCESS", response.getResponseCode); 
    } catch(Exception e){ 
    //After getting MyException the control comes here & thats the problem. assertEquals never get executed. 
    } } 
} 

Когда ответ линии Response = classtotest.method(); выполняется, тогда элемент управления переходит в блок кэша класса Test. Я хочу получить ответ, который создается с помощью myException ExceptionHandler &, чтобы проверить его код ответа. Может ли кто-нибудь сказать мне, как это сделать, используя Mockito?

ответ

2

Вы можете использовать атрибут expected, но если вам нужно проверить для некоторого конкретного сообщения, попробовать что-то вроде этого:

@Test 
    public void shouldThrowSomeException() { 
     String errorMessage = ""; 
     try { 
      Result result = service.method("argument"); 
     } catch (SomeException e) { 
      errorMessage = e.getMessage(); 
     } 
     assertTrue(errorMessage.trim().equals(
       "ExpectedMessage")); 
    } 
2

почему бы вам не использовать эту аннотацию

@Test(expected=MyException.class) 

and to assert that the exception has occurred while you're calling your method 

//use the mock and call another method that throws an error 
when(yourMock.anotherMethod()).thenThrow(new MyException(Constant.ERROR_CODE)); 
+0

Это не имеет смысла. Когда вы ожидаете, что ваш тестовый код выкинет исключение, вы не будете ** издеваться над этим. – GhostCat

1

Вы должны использовать предполагаемое поле в @Test сообщить тестовые случаи JUnit, которые, как ожидается исключение.

@Test(expected=Expectedexception.class) 
public void testMethod(){ 
    ClassToTest classtotest = new ClassToTest(); 
    Response response = classtotest.method(); 
    //your test case 
} 
+0

Кстати, в таких ситуациях вы действительно ставите 'новый ClassToTest(). Method()' в свой тестовый метод. Когда вы ожидаете исключений, абсолютно нет необходимости делиться classtotest или ответом. – GhostCat

+0

@ Jägermeister: да, вы правы! – sauumum

Смежные вопросы