web-dev-qa-db-ja.com

EntityManagerをモックする方法は?

エンティティマネージャーをモックして、テストサービスレイヤー(私の場合はセッションファサード)を基礎となるレイヤー(私の場合はエンティティマネージャー)から独立させる必要があります。

それで、これをどのように達成できますか? dbunitを使用する必要がありますか? easy/j(モック)は必要ですか?

30
Muhammad Hewedy

Mockito Frameworkを使用することをお勧めします。これは非常に使いやすく理解しやすいものです。

@Mock
private EntityManager entityManager; 

EntityManagerに属するメソッドを使用する場合は、呼び出す必要があります。

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

テストを実行すると、Mockito.whenでEntityManagerに対して以前に宣言された呼び出しは、宣言に入力された値を返します。

ここで完全なドキュメントを読んでください。

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

11
Koitoer

モックには powermock をお勧めします。自動生成されたプロキシのおかげで、インターフェイスからモックを作成することから始めて、静的な初期化を抑制して初期化のインターセプトを終了することで、想像できるほとんどすべてのことを実行できます(私を打ち負かしたのはモックJava.lang.Object)。

SessionFacadeTestSeesionFacadeのJUnitテストスイートであるとしましょう。

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();
    }
}

(注:ここに書いたので、コンパイルされない可能性もありますが、アイデアはわかります)。

1
Przemek Kryger

私は通常、テストケースで具体的なサービス実装をモックするためにEasyMockを使用しています。彼らの ユーザーガイド をチェックしてください。フレームワークのモック化の背後にある基本概念を一般的に説明し、EasyMockをすばやく実行できるようにする、非常に簡単なステップバイステップガイドが含まれています。

0
Stefan Haberl