Tengo un código similar a este a continuación:
Class A {
public boolean myMethod(someargs) {
MyQueryClass query = new MyQueryClass();
Long id = query.getNextId();
// some more code
}
}
Class MyQueryClass {
....
public Long getNextId() {
//lot of DB code, execute some DB query
return id;
}
}
Ahora estoy escribiendo una prueba para A.myMethod(someargs)
. Quiero omitir el método real query.getNextId()
y, en su lugar, devolver un valor de código auxiliar. Básicamente, quiero burlarme MyQueryClass
.
Entonces, en mi caso de prueba, he usado:
MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);
boolean b = A.getInstance().myMethod(args);
//asserts
Usé @RunWith(PowerMockRunner.class)
y @PrepareForTest({MyQueryClass.class})
al comienzo de mi clase de prueba.
Pero cuando depuro la prueba, sigue llamando al método real getNextId()
de la MyQueryClass
clase.
¿Que me estoy perdiendo aqui? ¿Alguien puede ayudarme ya que soy nuevo en Mockito y PowerMockito?
Como @TrueDub mencionó en su respuesta aceptada, debe agregar la clase donde se llama al constructor al
@PrepareForTest
.Sin embargo, si hace esto, la cobertura para esa clase según lo informado por eclemma y Sonar será cero para esa clase
Wiki bajoterra
Entonces, la solución aquí sería refactorizar el código real para usar una fábrica estática que devolvería una instancia de esa clase y luego simularla estáticamente.
fuente
Quizás puedas simplemente usar
fuente