简体   繁体   中英

Mockito refuses to throw checked exception

I'm using Mockito for my unit tests and I encounetered a problem with throwing exception on spied object. I have done this before on this object (in different test case and it worked). Here's the test code:

@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();
} 

here's the method on which the exception should be thrown:

protected MocFsm getSs7Fsm() throws FsmInitializationException {
    mocFsm.setContextProvider(getMocLocalObject());
    return mocFsm;
}  

the error I get during test execution looks like this:

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)  

Does anyone have any idea why it doesn't work in this case?

I have finally found the solution for this problem.

We have used an anonymous class extending original Sbb class which was tested and in this extended class implementation of mentioned method was altered and throws expression was removed which caused the problem.

I should have read my colleagues code more carefully.

I have a feeling the solution is to use doThrow() syntax instead of when().thenThrow(). When spying it is safer to use doThrow/doReturn syntax for stubbing. The reasons are somewhat described in the documentation: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#13

I think we can improve an exception message in this instance so that it is m

Following this answer . Using Mockito's doAnswer instead of thenThrow method solved my issue.

Mockito.doAnswer(
      invocation -> {
        throw new Exception("Something went wrong");
      })
  .when(moc)
  .getSs7Fsm();

I know it's too late but just in case anyone faces the same issue.

I know this post is very old but my solution it could be of help to someone: I solved this same error by changing the visibility of my method to be test to public.

In this case you whould have change

protected MocFsm getSs7Fsm() throws FsmInitializationException {
    ...
}

to

public MocFsm getSs7Fsm() throws FsmInitializationException {
    ...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM