[英]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.