如何模拟EntityManager?
问题描述:
我需要模拟实体管理器使测试服务层(在我的情况下是会话外观)独立于底层(在我的情况下是实体管理器)。如何模拟EntityManager?
那么我该如何做到这一点?我应该使用dbunit吗?我需要easy/j(模拟)吗?
答
我建议使用Mockito框架,它非常易于使用和理解。
@Mock
private EntityManager entityManager;
如果你想使用任何属于entityManager的方法,你应该调用。
Mockito.when(METHOD_EXPECTED_TO_BE_CALLED).thenReturn(AnyObjectoftheReturnType);
当你运行你的测试,在Mockito.when previosly申报EntityManager的任何调用将返回把在声明中值..
阅读完整的文档在这里。
https://static.javadoc.io/org.mockito/mockito-core/2.12.0/org/mockito/Mockito.html#stubbing
答
对于嘲笑,我建议powermock。感谢自动生成的代理,它可以完成几乎任何你可以想象的事情,从创建接口模拟开始,通过拦截初始化完成并抑制静态初始化(唯一让我嘲笑的是嘲弄java.lang.Object
)。
假设SessionFacadeTest
是您的JUnit测试套件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();
}
}
(注:我写在这里,所以甚至可能不编译,但会给你的想法)。
答
我通常使用EasyMock来模拟测试用例中的具体服务实现。看看他们的user guide。它包含一个非常简单的循序渐进指南,该指南解释了一般嘲讽框架背后的基本概念,并帮助您快速运行EasyMock。
说页面没有找到,也许你更新你的答案:) – cgew85 2016-01-11 13:58:13