Java Mockito拒绝抛出选中的异常
我使用Mockito进行单元测试,遇到了一个问题,在被监视的对象上抛出异常。我以前在这个对象上做过这件事(在不同的测试用例中,它工作了)。 以下是测试代码:Java Mockito拒绝抛出选中的异常,java,exception,junit,mockito,Java,Exception,Junit,Mockito,我使用Mockito进行单元测试,遇到了一个问题,在被监视的对象上抛出异常。我以前在这个对象上做过这件事(在不同的测试用例中,它工作了)。 以下是测试代码: @Test public void callInitiated_FsmInitializationException() throws FsmInitializationException, Exception { MocSbb moc = Mockito.spy(testObj); MocTracer tracer =
@Test
public void callInitiated_FsmInitializationException() throws FsmInitializationException, Exception {
MocSbb moc = Mockito.spy(testObj);
MocTracer tracer = Mockito.mock(MocTracer.class);
Mockito.doReturn(tracer).when(moc).getTracer();
CAP2InitialDPArg idp = Mockito.mock(CAP2InitialDPArg.class);
MocFsm mocFsm = Mockito.mock(MocFsm.class);
//Mockito.doReturn(mocFsm).when(moc).getSs7Fsm();
TicketingLocalInterface ticketing = mockTicketingLocalInterface();
CAP2InitialDPArgWrap idpWrap = Mockito.mock(CAP2InitialDPArgWrap.class);
PowerMockito.whenNew(CAP2InitialDPArgWrap.class).withArguments(idp, tracer).thenReturn(idpWrap);
MocSession mocSession = Mockito.mock(MocSession.class);
Mockito.doReturn(mocSession).when(moc).getMocSession();
Mockito.when(moc.getSs7Fsm()).thenThrow(new FsmInitializationException()); ////HERE'S THE PROBLEM
moc.callInitiated(idp);
verify(moc).getFailedFsm();
}
以下是引发异常的方法:
protected MocFsm getSs7Fsm() throws FsmInitializationException {
mocFsm.setContextProvider(getMocLocalObject());
return mocFsm;
}
我在测试执行期间遇到的错误如下所示:
Testcase: callInitiated_FsmInitializationException(com.nsn.as.ccs.moc.sbb.MocSbbTest): Caused an ERROR
Checked exception is invalid for this method!
Invalid: com.nsn.as.ccs.moc.fsm.FsmInitializationException
org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: com.nsn.as.ccs.moc.fsm.FsmInitializationException
at com.nsn.as.ccs.moc.sbb.MocSbbTest.callInitiated_FsmInitializationException(MocSbbTest.java:1194)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:322)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:309)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:73)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:297)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:222)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:161)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:135)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:133)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:112)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
有人知道为什么它在这种情况下不起作用吗?我觉得解决方法是使用doThrow()语法,而不是when()。然后throw()。进行间谍活动时,使用doThrow/doReturn语法进行存根比较安全。原因在文档中有所描述:
我认为我们可以改进这个例子中的异常消息,使其成为m我终于找到了这个问题的解决方案 我们使用了一个匿名类来扩展原始的
Sbb
类,该类经过测试,在这个扩展类中,所述方法的实现被修改,并且throws
表达式被删除,这导致了问题
我应该更仔细地阅读同事的代码。我知道这篇文章很老了,但我的解决方案可能对某人有所帮助: 我通过将要测试的方法的可见性更改为public,解决了同样的错误 在这种情况下,你应该找零钱
protected MocFsm getSs7Fsm() throws FsmInitializationException {
...
}
到
跟着。使用Mockito的doAnswer
而不是thenThrow
方法解决了我的问题
Mockito.doAnswer(
invocation -> {
throw new Exception("Something went wrong");
})
.when(moc)
.getSs7Fsm();
我知道为时已晚,但以防万一有人面临同样的问题。这不是重复的问题,而是关于该主题的另一个问题:我已经看到了,但它没有回答我的问题。谢谢,testObj的类型是什么?它是
MocSbb
还是超级类或接口?接口/父类是否也声明了异常?这也发生在我的类上,但有一个类实现了接口原因:stubing voids需要与Mockito不同的方法。when(Object)因为编译器不喜欢括号内的void方法…这对我不起作用。最终起作用的实际上是将异常更改为RuntimeException类型。我不清楚为什么Mockito不允许用这些方法抛出检查过的异常。
Mockito.doAnswer(
invocation -> {
throw new Exception("Something went wrong");
})
.when(moc)
.getSs7Fsm();