spring-boot - 在 unitTest JPA/Hibernate 中总是得到一个空对象
问题描述
我目前正在尝试我的函数是否适用于我当前的数据库,但我不断得到一个空对象。我的测试如下:
@Test
public void findJobOfferByIdReturnsCorrectJobOffer() {
User user = UserBuilder.anUser().build();
JobOffer firstJobOffer = JobOfferBuilder.aJobOffer()
.withId(108L)
.withCompany(user)
.build();
JobOffer secondJoboffer = JobOfferBuilder.aJobOffer()
.withAmountPerSession(55)
.withCompany(user)
.withId(208L)
.withJobDescription("Software Tester in PHP")
.build();
userDao.saveUser(user);
jobOfferDao.saveJobOffer(firstJobOffer);
jobOfferDao.saveJobOffer(secondJoboffer);
entityManager.clear();
entityManager.flush();
Optional<JobOffer> retrievedJobOffer = jobOfferDao.findJobOfferById(firstJobOffer.getId());
assertTrue(retrievedJobOffer.isPresent());
JobOffer jobOffer = retrievedJobOffer.get();
assertEquals(jobOffer.getId(), firstJobOffer.getId());
assertNotEquals(jobOffer.getId(), secondJoboffer.getId());
}
测试使用以下 DAOImpl 存储库:
@Repository
public class JobOfferDaoImpl implements JobOfferDao {
@PersistenceContext
private EntityManager entityManager;
private static final Logger LOGGER = LogManager.getLogger(UserDaoImpl.class);
@Override
public Optional<JobOffer> findJobOfferById(Long id) {
TypedQuery<JobOffer> jobOfferQuery = entityManager.createNamedQuery("findJobOfferById", JobOffer.class);
jobOfferQuery.setParameter("jobOfferId", id);
try {
return Optional.of(jobOfferQuery.getSingleResult());
} catch (NoResultException e) {
return Optional.empty();
}
}
@Transactional
public void saveJobOffer(JobOffer jobOffer) {
if (findJobOfferById(jobOffer.getId()).isEmpty()) {
entityManager.merge(jobOffer);
LOGGER.info(String.format("Joboffer with id %d is inserted in the database", jobOffer.getId()));
} else {
throw new JobOfferNotFoundException();
}
}
}
为“findJobOfferById”选择正确 jobOffer 的查询如下:
@NamedQuery(name = "findJobOfferById", query = "SELECT j from JobOffer j WHERE j.id = :jobOfferId"),
尝试调试时,我得到以下信息:
解决方案
在测试中,您不应该提供自己的 ID。改变它:
.withId(null)
在 DAO 中,您必须坚持 jobOffer 并实际添加它。通过合并,您正在修改它。
entityManager.persist(jobOffer);
推荐阅读
- python - 在python中制作多种类型的列表元素
- c# - 在 C# 中将字节 [3] 转换为字节 [2]
- visual-studio - 使用脚本在 VSTS 中创建自定义构建定义
- python - 如何使用逗号分隔符将数字保存为python中的整数作为字符串存储
- python - Keras 回归的 GridSearch 实现
- ballerina - Ballerina wso2/gmail 包:无法导入
- javascript - 将文本从 div 复制到输入 javascript
- grafana-alerts - 当数据在 x 分钟内没有变化时发出 Grafana 警报
- jsf - 如何在 PrimeFaces 的芯片中使用属性自动完成
- linux - 共享库卸载的挂钩函数