簡體   English   中英

Java-如何測試捕獲塊?

[英]Java - How to Test Catch Block?

轉貼一點,但是關於沒有足夠聲譽的某些22捕捉意味着我無法對任何重復的線程發表評論! (咳嗽)

我正在嘗試使用Mockito測試try-catch的catch塊; 是否有可能使模擬拋出由被測試方法處理的異常? 我不能使用doThrow()... when()...或@Test(expected = 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();

有沒有辦法做到這一點?

這里的答案(使用Junit和Mockito的Test catch塊邏輯)不起作用(我相信),因為異常是在到達測試級別之前進行處理的。

提示和想法深表感謝!

BDD風格解決方案

單獨的Mockito並不是處理異常的最佳解決方案, 請將MockitoCatch-Exception一起使用

Mockito + 捕獲異常 + AssertJ
given(otherServiceMock.bar()).willThrow(new MyException());

when(myService).foo();

then(caughtException()).isInstanceOf(MyException.class);
樣例代碼 依賴
  • eu.codearte.catch的異常:捕獲的異常:1.3.3
  • org.assertj:assertj核心:1.7.0
壞處
  • 僅支持高達1.10.8的Mockito

為什么在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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM