Soy nuevo en Mockito.
Dada la clase a continuación, ¿cómo puedo usar Mockito para verificar que someMethod
se invocó exactamente una vez que foo
se invocó?
public class Foo
{
public void foo(){
Bar bar = new Bar();
bar.someMethod();
}
}
Me gustaría hacer la siguiente llamada de verificación,
verify(bar, times(1)).someMethod();
donde bar
es una instancia simulada de Bar
.
Respuestas:
Inyección de dependencia
Si inyecta la instancia de Bar, o una fábrica que se utiliza para crear la instancia de Bar (o una de las otras 483 formas de hacerlo), tendría el acceso necesario para realizar la prueba.
Ejemplo de fábrica:
Dada una clase de Foo escrita así:
en su método de prueba puede inyectar un BarFactory como este:
Bonificación: este es un ejemplo de cómo TDD puede impulsar el diseño de su código.
fuente
Bar bar = mock(Bar.class)
en lugar deBar bar = new Bar();
BarFactory myFactory = mock(BarFactory.class); when(myFactory.createBar()).thenReturn(bar);
La respuesta clásica es: "No lo haces". Usted prueba la API pública de
Foo
, no sus componentes internos.¿Hay algún comportamiento del
Foo
objeto (o, menos bueno, algún otro objeto en el entorno) que se vea afectadofoo()
? Si es así, prueba eso. Y si no, ¿qué hace el método?fuente
Foo
ispublic void foo()
, donde las partes internas solo están relacionadas con barras.verify()
hecho se vuelven muy útiles, incluso si ya no estás adorando en el altar sagrado de las pruebas de integración.Si no quieres usar DI o Fábricas. Puedes refactorizar tu clase de una manera un poco complicada:
Y tu clase de prueba:
Entonces la clase que llama a tu método foo lo hará así:
Como puede ver al llamar al método de esta manera, no necesita importar la clase Bar en ninguna otra clase que esté llamando a su método foo, que tal vez sea algo que desee.
Por supuesto, la desventaja es que está permitiendo que la persona que llama configure el objeto de barra.
Espero eso ayude.
fuente
Solución para su código de ejemplo usando
PowerMockito.whenNew
FooTest.java
Salida JUnit
fuente
Creo que Mockito
@InjectMocks
es el camino a seguir.Dependiendo de su intención, puede usar:
Más información en documentos
A continuación se muestra un ejemplo con inyección de campo:
Clases
Prueba:
fuente
Sí, si realmente quiere / necesita hacerlo, puede usar PowerMock. Esto debería considerarse un último recurso. Con PowerMock puede hacer que devuelva un simulacro de la llamada al constructor. Luego haga la verificación en el simulacro. Dicho esto, csturtz es la respuesta "correcta".
Aquí está el enlace a la construcción simulada de nuevos objetos
fuente
Otra forma simple sería agregar alguna declaración de registro a bar.someMethod () y luego asegurarse de que pueda ver dicho mensaje cuando se ejecute su prueba, vea ejemplos aquí: Cómo hacer una afirmación JUnit en un mensaje en un registrador
Eso es especialmente útil cuando su Bar.someMethod () es
private
.fuente