如何模拟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。

+0

说页面没有找到,也许你更新你的答案:) – cgew85 2016-01-11 13:58:13