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!
De hecho, he abierto un problema sobre un problema que podría estar relacionado. http://code.google.com/p/powermock/issues/detail?id=342 –