2011-03-12 26 views
11

Estoy tratando de hacer que PowerMock funcione con mockito, y estoy siguiendo la documentación aquí: http://code.google.com/p/powermock/wiki/MockitoUsage13.PowerMock, mockito, verificar el método estático

Para simplificar un poco, digamos que tengo un método estático:

StaticObj.put(String key, String val) { ... } 

Y la clase para ser probado hace algo como esto:

public class ClassToTest { 
    public void doSomething(Params p) { 
     if (StringUtils.isNotBlank(p.getK()) StaticObj.put("k1", p.getK()); 
     if (StringUtils.isNotBlank(p.getX()) StaticObj.put("x1", p.getX()); 
    } 
} 

En mi prueba de unidad que había desea verificar que StaticObj.put se llama para K y X cuando no están en blanco o nulos, entonces hago algo como esto:

public void testNormalCase() { 
    // assume that mocking setup for statics already happened in some @Before function.. 
    Params params = new Params("k", "x"); 
    ClassToTest classToTest = new ClassToTest(); 
    classToTest.doSomething(params); 

    // now I want to verify: 
    PowerMockito.verifyStatic(times(1)); 
    StaticObj.put("k1", "k1"); 

    PowerMockito.verifyStatic(times(1)); 
    StaticObj.put("x1", "x"); 
} 

Esto funciona, y es lo que esperaría. Lo que no funciona, es que si comento la verificación de K, la verificación de X falla. El mensaje de error indica que ("x1", "x") se espera pero se obtuvo ("k1", "k"). ¿Por qué es esto? ¿No estoy codificando esto correctamente?

También me lleva a creer que el siguiente tipo de prueba, la cual pasa, podría pasar por la razón equivocada por completo:

public void testOtherCase() { 
    // assume that mocking setup for statics already happened in some @Before function.. 
    Params params = new Params("k", null); 
    ClassToTest classToTest = new ClassToTest(); 
    classToTest.doSomething(); 

    // now I want to verify: 

    PowerMockito.verifyStatic(never()); 
    StaticObj.put(eq("x1"), anyString()); 
} 

P. ej Me pregunto si powermock ve "k1", decide que "x1" nunca se llamó, y pasa. (?)

Para decirlo en general, tengo un método estático que se denomina N veces (donde N cambia dependiendo de los parámetros de entrada). Y quiero verificar que se llamó en los casos correctos (que se puede determinar mediante parámetros de entrada). Parece que powermock no lo maneja bien, a menos que lo malinterprete.

¡Gracias por cualquier idea!

+2

De hecho, he abierto un problema sobre un problema que podría estar relacionado. http://code.google.com/p/powermock/issues/detail?id=342 –

Respuesta

6

He leído esta pregunta y el problema con cuidado, pero no estoy seguro si entendí claramente - Desde mi entender, es correcto que powermock levante la excepción cuando pase k y x, pero solo verifique k.

Debido a que está burlando el método estático StaticObj.put, cuando se pasa el parámetro kyx y verificar con

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("k1", "k1"); 

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("x1", "x"); 

Esto debería funcionar. Y cuando verificas los parámetros k y x con verificación para k se comentan.

// PowerMockito.verifyStatic(times(1)); 
// StaticObj.put("k1", "k1"); 

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("x1", "x"); 

Powermock obtendrá la invocación con put ("k1" ...) en primer lugar, aparentemente, por lo que la verificación de x generará un error. Tu proceso de verificación está secuenciado.

Cuestiones relacionadas