gpt4 book ai didi

java - 传递来验证的参数不是 Mock

转载 作者:行者123 更新时间:2023-11-30 02:09:24 33 4
gpt4 key购买 nike

我是用 Java 编写测试并尝试学习 Mockito 的新手。

这是我想要测试的类(class)的一部分。

public class ExamRepository implements IExamRepository {
private static final Logger LOGGER = LogManager.getLogger(ExamRepository.class);

private IStudentRepository studentRepository = new StudentRepository();
private EntityManager entityManager;

public ExamRepository() {
entityManager = EntityController.getEntityManager();
}

public ExamRepository(EntityManager entityManager){
this.entityManager = entityManager;
}

// Get all exam skeletons from the DB
@Override
public List<ExamSkeleton> getAllSkeletons() {
try {
TypedQuery<ExamSkeleton> query = entityManager.createQuery("SELECT NEW ExamSkeleton (s.id, s.filename, s.course, s.visible) FROM ExamSkeleton as s", ExamSkeleton.class);

return query.getResultList();
} catch (IllegalArgumentException exception) {
LOGGER.error(exception);
}

return Collections.emptyList();
}
}

这是我写的实际测试,感觉有错误:传递给 verify() 的参数是 ExamRepository 类型,而不是模拟!

由于这一行而发生:

examRepository = new ExamRepository(entityManager);

但是我不确定如何重写它。我也不确定除了它运行一次之外我还应该测试什么。

public class ExamRepositoryTest {
@InjectMocks
private ExamRepository examRepository;

@Mock
private EntityManager entityManager;

@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();

@Test
public void canGetAllSkeletons(){
examRepository = new ExamRepository(entityManager);

List<ExamSkeleton> examSkeletons = new ArrayList<>();
examSkeletons.add(new ExamSkeleton());
examSkeletons.add(new ExamSkeleton());

TypedQuery query = mock(TypedQuery.class);
when(entityManager.createQuery(anyString(), Matchers.anyObject())).thenReturn(query);
when(query.getResultList()).thenReturn(examSkeletons);

verify(examRepository, times(1)).getAllSkeletons();
}
}

希望你们能让我走上正确的道路!

最佳答案

像这样使用它:

@Test
public void canGetAllSkeletons(){
examRepository = new ExamRepository(entityManager);

List<ExamSkeleton> expected = new ArrayList<>();
expected.add(new ExamSkeleton());
expected.add(new ExamSkeleton());

TypedQuery query = mock(TypedQuery.class);
when(entityManager.createQuery(anyString(), anyObject())).thenReturn(query);
when(query.getResultList()).thenReturn(expected);

List<ExamSkeleton> result = examRepository.getAllSkeletons();

assertEquals(expected, result);
}

您的想法几乎是正确的,但您不需要验证调用,只需在测试中实际调用 examRepository.getAllSkeletons() 并根据预期返回值检查结果TypedQuery。

由于只有在之前的模拟步骤有效的情况下您才能获得正确的结果列表,因此您无需验证 EntityManager 模拟上的任何调用。

关于java - 传递来验证的参数不是 Mock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50551455/

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