que persistencecontext example crear context java unit-testing jpa mocking entitymanager

java - persistencecontext - persistence context que es



¿Cómo burlarse de EntityManager? (3)

Necesito simular un administrador de entidades para hacer que la capa de servicio de prueba (en mi caso una fachada de sesión) sea independiente de la capa subyacente (que en mi caso es el administrador de entidades).

Entonces, ¿cómo puedo lograr esto? ¿Debo usar dbunit? ¿Necesito easy / j (Mock)?


Normalmente uso EasyMock para simular la implementación del servicio concreto en casos de prueba. Echa un vistazo a su guía de usuario . Incluye una guía paso a paso muy fácil de seguir, que explica los conceptos básicos detrás de los marcos de simulacros en general y le permite comenzar a utilizar EasyMock rápidamente.


Para burlarse, sugeriría powermock . Gracias a los proxies generados automáticamente, puede hacer prácticamente cualquier cosa que pueda imaginar, comenzando con la creación de simulacros desde las interfaces, a través de la intercepción de la inicialización y la supresión de la inicialización estática (lo único que me ganó fue jugar con el simulacro de java.lang.Object ).

Digamos que el SessionFacadeTest es su conjunto de pruebas JUnit para SeesionFacade .

import static org.powermock.api.easymock.PowerMock.createMock; import static org.powermock.api.easymock.PowerMock.replayAll; import static org.powermock.api.easymock.PowerMock.verifyAll; import static org.easymock.EasyMock.anyObject; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import javax.persistence.EntityManager; @RunWith(PowerMockRunner.class) @PrepareForTest({SessionFacade.class}) public class SessionFacadeTest { @Test public void persistingObject() { //set up stage SessionFacade fixture = new SessionFacade(); EntityManager managerMock = createMock(EntityManager.class); fixture.setManager(managerMock); //record expected behavior managerMock.persist(anyObject()); //testing stage replayAll(); fixture.anyMethodThatCallPersist(); //asserting stage verifyAll(); } }

(Nota: lo escribí aquí, por lo que incluso puede que no se compile, pero le daré la idea).


Sugiero que usar Mockito Framework es muy fácil de usar y entender.

@Mock private EntityManager entityManager;

Si desea utilizar cualquier método que pertenezca a entityManager, debe llamar.

Mockito.when(METHOD_EXPECTED_TO_BE_CALLED).thenReturn(AnyObjectoftheReturnType);

Cuando ejecute su prueba, cualquier llamada declarada previamente en Mockito.when para EntityManager devolverá el valor puesto en la declaración.

Lea la documentación completa aquí.

https://static.javadoc.io/org.mockito/mockito-core/2.12.0/org/mockito/Mockito.html#stubbing