2011-07-11 14 views
10

Estoy usando Mockito para mis pruebas de unidad y he codificado un problema con arrojar una excepción en el objeto espía. He hecho esto antes en este objeto (en diferentes casos de prueba y funcionó). Aquí está el código de prueba:Mockito se rehúsa a arrojar una excepción marcada

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

aquí es el método en el que la excepción debe ser desechado:

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

el error que consigo durante la ejecución de la prueba es el siguiente:

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) 

¿El Alguien tiene alguna idea de por qué no funciona en este caso?

+1

No es un duplicado, pero otra pregunta sobre ese tema: http://stackoverflow.com/questions/3762047/throw-checked -exceptions-from-mocks-with-mockito –

+0

Lo he visto, pero no responde mi pregunta. gracias aunque – Edheene

+0

¿Cuál es el tipo de testObj? ¿Es 'MocSbb' o es una súper clase o interfaz? ¿La interfaz/clase padre también declara la excepción? – Bringer128

Respuesta

7

fin he encontrado la solución para este problema.

Hemos utilizado una clase anónima que se extiende original de clase Sbb que fue probado y en esta implementación clase extendida de método mencionado fue alterada y throws expresión se eliminó que causó el problema.

Debería haber leído el código de mis colegas con más cuidado.

+0

También me pasó a mí, pero con una clase implementando una interfaz – JeanValjean

2

Tengo la sensación de que la solución es utilizar la sintaxis doThrow() en lugar de cuando(). ThenThrow(). Al espiar, es más seguro utilizar la sintaxis doThrow/doReturn para el corte. Las razones se describen tanto en la documentación: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#13

creo que podemos mejorar un mensaje de excepción en este caso para que sea m

+0

Motivo: anular vacíos requiere un enfoque diferente de Mockito.when (Object) porque al compilador no le gustan los métodos vacíos dentro de los paréntesis ... – rohanagarwal

0

Sé que esta publicación es muy antigua, pero mi solución podría ser de ayuda para alguien: He resuelto este mismo error al cambiar la visibilidad de mi método para que se pruebe al público.

En este caso, usted tiene whould cambio

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

a

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