Java - Как проверить Catch Block? - PullRequest
0 голосов
/ 23 июня 2018

Немного репоста, но определенное замечание о недостаточной репутации означает, что я не могу комментировать ни одну из дублирующих тем! (кашель)

Я пытаюсь проверить блок catch для try-catch, используя Mockito; Можно ли сделать ложный выброс исключения, которое обрабатывается тестируемым методом? Я не могу использовать doThrow () ... when () ... или @Test (ожидается = Foo.class), потому что обработано исключение. Я хочу проверить, что метод правильно обрабатывает исключения.

@Controller
public class StockExchangeController {

    public ModelAndView placeOrder(ModelAndView mav, MyObj myObj) {

        try {
            validator.validate(myObj); // Throws CustomException if validation fails
            mav.setViewName("successPage");

        } catch (CustomException ex) {
            mav.setViewName("failPage");
        }

        return mav;
    }
}

Я бы хотел иметь возможность заглушить поведение моего "validatorObject", например

doThrow(new CustomException()).when(validatorMock).validate();

Есть ли способ сделать это?

ответ здесь (тестировать логику блока catch с Junit и mockito) не работает (я считаю), потому что исключение обрабатывается до того, как оно достигнет уровня тестирования.

Советы и мысли высоко ценится!

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Почему doThrow(..).when(..)... не работает?

Метод placeOrder перехватывает исключение и возвращает тестируемый результат:

@RunWith(MockitoJUnitRunner.class)
public class TestStockExchangeController {

    @Mock
    Validator validator;

    @Mock MyObj myObj;

    @Test
    public void testException() throws CustomException {
        StockExchangeController sec = new StockExchangeController(validator);
        doThrow(new CustomException()).when(validator).validate(myObj);

        ModelAndView modelAndView = sec.placeOrder(new ModelAndView(), myObj);
        assertEquals("failPage", modelAndView.getViewName());
    }
}

Я тестировал эти два файла:

Основной исходный код:

//src/main/java/StockExchangeController.java
public class StockExchangeController {

    private ValidationFactory factory;

    public ModelAndView placeOrder(ModelAndView mav, MyObj myObj) {
        Validator validator = factory.getValidator("S");
        try {
            validator.validate(myObj); // Throws CustomException if validation fails
            mav.setViewName("successPage");
        } catch (CustomException ex) {
            mav.setViewName("failPage");
        }
        return mav;
    }
}

class CustomException extends Exception {}

interface ValidationFactory {
    Validator getValidator(String s);
}

class Validator {
    public void validate(MyObj myObj) throws CustomException {}
}

class ModelAndView {
    private String viewName;

    public void setViewName(String viewName) {
        this.viewName = viewName;
    }

    public String getViewName() {
        return viewName;
    }
}

class MyObj {}

Исходный код теста:

//src/test/java/TestStockExchangeController.java
//various imports
@RunWith(MockitoJUnitRunner.class)
public class TestStockExchangeController {

    @Mock
    private Validator validator;

    @Mock
    private ValidationFactory validationFactory;

    @InjectMocks
    StockExchangeController target = new StockExchangeController();

    @Test
    public void testException() throws CustomException {
        MyObj myObj = new MyObj();
        when(validationFactory.getValidator(anyString())).thenReturn(validator);
        doThrow(new CustomException()).when(validator).validate(myObj);

        ModelAndView modelAndView = target.placeOrder(new ModelAndView(), myObj);

        assertEquals("failPage", modelAndView.getViewName());
        verify(validator).validate(myObj);
    }
}
0 голосов
/ 23 июня 2018

BDD Style Solution

Mockito не является лучшим решением для обработки исключений, используйте Mockito с Catch-Exception

Mockito + Catch-Exception + AssertJ
given(otherServiceMock.bar()).willThrow(new MyException());

when(myService).foo();

then(caughtException()).isInstanceOf(MyException.class);
Пример кода Зависимости
  • eu.codearte.catch-исключение: catch-исключение: 1.3.3
  • org.assertj: assertj-core: 1.7.0
Недостаток
  • Поддерживается только Mockito до 1.10.8
...