[英]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並不是處理異常的最佳解決方案, 請將Mockito與Catch-Exception一起使用
Mockito + 捕獲異常 + AssertJgiven(otherServiceMock.bar()).willThrow(new MyException());
when(myService).foo();
then(caughtException()).isInstanceOf(MyException.class);
樣例代碼
依賴
為什么在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.