首页 > 解决方案 > 在 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"),

尝试调试时,我得到以下信息:

在此处输入图像描述

标签: spring-boothibernatejpajunitspring-data-jpa

解决方案


在测试中,您不应该提供自己的 ID。改变它:

.withId(null)

在 DAO 中,您必须坚持 jobOffer 并实际添加它。通过合并,您正在修改它。

entityManager.persist(jobOffer);

推荐阅读