如何模拟EntityManager?

时间:2010-11-28 08:49:43

标签: java unit-testing jpa mocking entitymanager

我需要模拟实体管理器,使测试服务层(在我的情况下是一个会话外观)独立于底层(在我的例子中是实体管理器)。

那我怎么能做到这一点?我应该使用dbunit吗?我需要easy / j(模拟)吗?

3 个答案:

答案 0 :(得分:11)

我建议使用Mockito Framework,它非常易于使用和理解。

@Mock
private EntityManager entityManager; 

如果要使用属于entityManager的任何方法,则应调用。

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

当您运行测试时,任何在Mockito.hen中为EntityManager声明的调用都会返回声明中的值。

在此处阅读完整文档。

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

答案 1 :(得分:1)

对于嘲笑,我建议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();
    }
}

(注意:我在这里写了,所以甚至可能不会编译,但会给你这个想法)。

答案 2 :(得分:0)

我通常使用EasyMock来模拟测试用例中的具体服务实现。看看他们的user guide。它包含一个非常容易遵循的分步指南,它解释了一般模拟框架背后的基本概念,并使您快速启动并运行EasyMock。