【问题标题】:How to mock EntityManager?如何模拟EntityManager?
【发布时间】:2011-05-16 19:30:22
【问题描述】:

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

那么我该如何实现呢?我应该使用 dbunit 吗?我需要easy/j(Mock)吗?

【问题讨论】:

    标签: java unit-testing jpa mocking entitymanager


    【解决方案1】:

    我建议使用 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

    【讨论】:

      【解决方案2】:

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

      (注意:我在这里写的,所以可能编译不出来,但会给你的想法)。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2021-02-01
          • 2017-06-29
          • 1970-01-01
          • 2014-06-16
          • 2018-05-09
          • 2014-12-17
          • 2015-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多