使用Mockito模拟实体管理器并测试无状态EJB

时间:2018-12-06 16:42:34

标签: java junit mockito ejb

所以我不熟悉使用Mockito进行测试,我查阅了一些教程,但了解起来却很慢。 我有一个支持EJB的端点。我想测试中的方法 EJB。我尝试了很多选择,显然我得到了nullpointer异常。 (我知道 空指针异常是)。模拟实体管理器不会持久化对象。所以给我 当我尝试对空列表执行任何操作时,将返回null指针异常。请任何人都可以展示 我该如何解决这个问题,或者让我指向我可以阅读的任何详细文章或教程,以促进学习。谢谢你们。

这是我的ejb。

[merge]
    tool = vimdiff

[mergetool "vimdiff"]
    cmd = vimdiff $LOCAL $BASE $REMOTE $MERGED -c '$wincmd w | wincmd J'

1 个答案:

答案 0 :(得分:0)

为避免NullPointerException,可以尝试在MovieHandlerTest类中添加以下代码:

import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;

[..]

@Mock
EntityManager manager;

@Mock
TypedQuery<Movie> query;

[..]

@Before
public void setUp() {
    final Movie first = new Movie();
    first.setName("MISSION IMPOSSIBLE");
    first.setAvailableCopies(10);
    first.setIsbn("ABC788900");

    final Movie second = new Movie();
    first.setName("JAMES BOND");
    first.setAvailableCopies(10);
    first.setIsbn("ABC788999");

    final Movie last = new Movie();
    first.setName("HARRY POTTER");
    first.setAvailableCopies(10);
    first.setIsbn("ABC7882000");

    when(manager.createQuery(any(String.class), eq(Movie.class))).thenReturn(query);
    when(query.setParameter(any(String.class), any(String.class))).thenReturn(query);
    when(query.getSingleResult()).thenReturn(first, second, last);
}

但是“ Response.ok(borrow).build()”出现了另一个问题

您有3种解决方案:

  1. 重构代码以引入执行借用工作流并返回模型的类,然后对该类进行单元测试
  2. 添加具有测试范围(例如Jersey)的JAX-RS实现
  3. 由于无法单独使用Mockito模拟静态方法,因此可以尝试 添加另一个测试库(例如PowerMockito),并模拟Reponse静态方法调用。

对于解决方案2,您可以添加以下Maven依赖项:

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.13</version>
        <scope>test</scope>
    </dependency>