web-dev-qa-db-fra.com

Comment se moquer de l'entitémanager?

J'ai besoin de se moquer d'entité-manager pour effectuer une couche de service d'essai (dans mon cas une façade de session) pour être indépendante de la couche sous-jacente (qui dans mon cas est l'entité-gestionnaire).

Alors, comment je peux accomplir cela? Devrais-je utiliser dbunit? Ai-je besoin facile/j (simulé)?

30
Muhammad Hewedy

Je suggère d'utiliser le cadre Mockito, il est très facile à utiliser et à comprendre.

@Mock
private EntityManager entityManager; 

Si vous souhaitez utiliser une méthode appartenant à EntityManager, vous devez appeler.

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

Lorsque vous exécutez votre test, tout appel prédiscipliné dans le mokito.Lorsque pour l'entitémanager retournera la valeur dans la déclaration ..

Lisez la documentation complète ici.

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

11
Koitoer

Pour se moquer, je vous suggérerais PowerMock . Grâce aux proxies automatiques générées, il peut faire pratiquement tout ce que vous pouvez imaginer, en commençant par créer des simulacres des interfaces, en interceptant la finition d'initialisation avec une initialisation statique suppression (la seule chose qui me battait était en train de jouer avec la moqueur Java.lang.Object).

Disons que le SessionFacadeTest est votre suite de test JUNIT pour 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();
    }
}

(Remarque: je l'ai écrit ici, alors peut même pas compiler, mais vous donnera l'idée).

1
Przemek Kryger

J'utilise généralement EasyMock pour la mise en œuvre de services de béton moqueur dans les cas de test. Découvrez leur Guide de l'utilisateur . Il comprend un guide étape par étape très facile à suivre, ce qui explique les concepts de base derrière des cadres moqueurs en général et vous permet d'exécuter rapidement avec EasyMock.

0
Stefan Haberl