2011-09-20 17 views
22

Estoy tratando de usar Powermock y Mockito para simular un método estático vacío para lanzar una excepción como la siguiente. Pero me encontré con un problema. A menos que realice las dos invocaciones de Adder.add() con el mismo argumento, no se lanzará el IOException burlado.¿Cómo burlarse de un método estático vacío para lanzar una excepción con Powermock?

BTW, he agregado @RunWith(PowerMockRunner.class) y @PrepareForTest(Adder.class) a la clase de prueba de la unidad.

class Adder{ 
    public static void add(int i) throws IOException{ 
     return; 
    } 
} 

@Test 
public void testAdder() throws IOException{ 
    PowerMockito.mockStatic(Adder.class); 
    PowerMockito.doThrow(new IOException()).when(Adder.class); 
    Adder.add(12); 
    try { 
     Adder.add(11); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    // assert things 
} 

Gracias de antemano. :)

La respuesta es como abajo.

Después de consultar aquí http://code.google.com/p/powermock/issues/detail?id=278, de hecho Adder.add (12) anterior es parte de la configuración método estático simulacro. Significa que al invocar Adder.add() con el argumento 12, se lanzará IOException. Es difícil de entender, ¿verdad? :) Por lo tanto, debe escribirse como a continuación.

PowerMockito.mockStatic(Adder.class); 
PowerMockito.doThrow(new IOException()).when(Adder.class); 
Adder.add(anyInt()); 

Respuesta

23

La respuesta es como abajo.

Después de consultar aquí http://code.google.com/p/powermock/issues/detail?id=278, de hecho, Adder.add (12) anterior es parte de la configuración del método estático falso. Significa que al invocar Adder.add() con el argumento 12, se lanzará IOException. Es difícil de entender, ¿verdad? :) Por lo tanto, debe escribirse como a continuación.

PowerMockito.mockStatic(Adder.class); 
PowerMockito.doThrow(new IOException()).when(Adder.class); 
Adder.add(anyInt()); 

EDIT:
Enlace está muerto, tratar Internet Archive uno en su lugar.

+2

Esto no es intuitivo en absoluto. Luchado para hacer que esto funcione. Gracias por el consejo. – Dhiraj

+1

Tenga en cuenta que 'Adder.add (anyInt());' no es lo que desencadena la excepción aquí, sino que lo aplica a las llamadas a 'Adder.add()'. – sjngm

0

¿Olvidó poner PowerMock en el modo de reproducción?

How to Mock Static methods.

por su enlace ...

Cómo verificar el comportamiento Verificación de un método estático se realiza en dos pasos. Primero llame al PowerMockito.verifyStatic() para comenzar a verificar el comportamiento y llame al método estático que desea verificar. P.ej.

PowerMockito.verifyStatic(); 
Static.firstStaticMethod(param); 

Importante: Es necesario llamar por verifyStatic() verificación método.

+0

He leído el tutorial aquí desde que estoy usando Mockito. http://code.google.com/p/powermock/wiki/MockitoUsage13 No menciona que tengo que usar el modo de reproducción. – Smartmarkey

+0

Vaya. Vio PowerMockito y leyó PowerMock. –

+0

Editado por su enlace –

1

O

PowerMockito.mockStatic(Adder.class); 
PowerMockito.doThrow(new IOException()).when(Adder.class, "add", Mathers.eq(12)); 
Cuestiones relacionadas