我想测试一个JSF Backing-Bean方法“isInProgress”,该方法委托给一个服务方法“isInProgress”。当服务方法抛出异常时,bean应该将事件放在特定的事件记录器上并返回false。
当我调试以下测试时,我进入了catch块。模拟的服务没有抛出异常,而是返回一个布尔值为false的“默认答案”。我做错了什么?
我还想知道是否可以以某种方式避免“when”调用周围的try-catch,因为正在测试的Bean会吞噬实际的异常。事实上,我认为“声明式”地将方法名称传递给“when”应该足够了。有没有更简洁的方法?
当我调试以下测试时,我进入了catch块。模拟的服务没有抛出异常,而是返回一个布尔值为false的“默认答案”。我做错了什么?
我还想知道是否可以以某种方式避免“when”调用周围的try-catch,因为正在测试的Bean会吞噬实际的异常。事实上,我认为“声明式”地将方法名称传递给“when”应该足够了。有没有更简洁的方法?
@Test
public void testIsInProgressExeption() {
//prepare object and inputs
MyBean bean = new MyBean();
MyService service = mock(MyAdapterService.class);
bean.setService(service);
try {
when(bean.getService().isInProgress()).thenThrow(new Exception());
} catch (Exception e) {
//prepare expected object and result
MyBean expectedBean = new MyBean();
expectedBean.setService(service);
boolean expected = false;
//execute method under test
boolean actual = bean.isInProgress();
//check return values and exceptions
assertEquals(expected, actual);
//check that bean did not change unexpectedly
assertTrue(bean.equals(expectedBean));
//check sideeffects on event log
assertTrue(logEvents.containsMessage("MDI09"));
}
}
以下是更新后的测试内容:
@Test
public void testIsInProgressExeption() throws Exception {
//prepare object and inputs
MyBean bean = new MyBean();
MyService service = mock(MyAdapterService.class);
bean.setService(service);
when(bean.getService().isInProgress()).thenThrow(new Exception());
//prepare expected object and result
MyBean expectedBean = new MyBean();
expectedBean.setService(service);
boolean expected = false;
//execute method under test
boolean actual = bean.isInProgress();
//check return values and exceptions
assertEquals(expected, actual);
//check that bean did not change unexpectedly
assertTrue(bean.equals(expectedBean));
//check sideeffects on event log
assertTrue(logEvents.containsMessage("MDI09"));
}