gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:51 27 4
gpt4 key购买 nike

所以我是用mockito进行测试的新手,我查阅了一些教程,但我理解起来很慢。我有一个由 EJB 支持的端点。我想测试中的方法EJB。我尝试了很多选项,显然我遇到了空指针异常。 (我知道什么是空指针异常是)。模拟的实体管理器不会持久化对象。所以它给了我当我尝试对空列表执行任何操作时出现空指针异常。请任何人都可以展示我该如何解决这个问题,或者向我指出我可以阅读的任何详细文章或教程,以促进我的学习。谢谢大家。

这是我的 ejb。

@Stateless
public class CustomerHandler {

@PersistenceContext
private EntityManager em;

public Response borrowMovie(List<RequestMovieDto> borrow) {
borrow.forEach(movies -> {
final Movie movie = findMovieByName(movies.getName());
movie.setAvailableCopies((movie.getAvailableCopies()) - movies.getAmount());
em.merge(movie);
});

return Response.ok(borrow).build();
}

public Movie findMovieByName(String name) {
return em.createQuery("SELECT m FROM Movie m "
+ "WHERE m.name = :name", Movie.class)
.setParameter("name", name)
.getSingleResult();
}
}

and this is my test class

@RunWith(MockitoJUnitRunner.class)
public class MovieHandlerTest {

@Mock
EntityManager manager;

private List<RequestMovieDto> request;

@InjectMocks
CustomerHandler handler;

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

manager.persist(first);

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

manager.persist(second);

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

manager.persist(last);

}

@Test
public void borrowMovie() {
RequestMovieDto first = new RequestMovieDto();
first.setName("MISSION IMPOSSIBLE");
first.setAmount(2);

RequestMovieDto second = new RequestMovieDto();
second.setName("JAMES BOND");
second.setAmount(1);

request = Arrays.asList(first, second);
final var response = handler.borrowMovie(request);

assertEquals(Response.Status.OK, response.getStatusInfo().toEnum());
}
}

最佳答案

为了避免 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. 添加具有测试范围的 JAX-RS 实现,例如 Jersey
  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>

关于java - 使用mockito模拟实体管理器并测试无状态EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53655978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com