如何模拟实体管理器?
2022-09-01 09:07:18
我需要模拟实体管理器,以使测试服务层(在我的情况下是会话外观)独立于底层(在我的情况下是实体管理器)。
那么我该如何做到这一点呢?我应该使用 dbunit 吗?我需要 easy/j(Mock)嗎?
我需要模拟实体管理器,以使测试服务层(在我的情况下是会话外观)独立于底层(在我的情况下是实体管理器)。
那么我该如何做到这一点呢?我应该使用 dbunit 吗?我需要 easy/j(Mock)嗎?
我建议使用Mockito框架,它非常易于使用和理解。
@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
对于嘲笑,我建议powermock。多亏了自动生成的代理,它几乎可以做任何你能想象到的事情,从从接口创建模拟开始,到拦截初始化结束,抑制静态初始化(唯一打败我的是搞砸了嘲笑)。java.lang.Object
假设是 您的 JUnit 测试套件。SessionFacadeTest
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();
}
}
(注意:我在这里写了它,所以甚至可能不编译,但会给你想法)。