У меня есть объект с именем «Голосование», в котором есть поле «Категория», которое также является другим объектом.
@Entity
public class Vote {
@OneToOne
@JoinColumn(name = "category_id")
private Category category;
private int score;
Теперь у меня есть сценарий использования, в котором я хочу получить все голоса из базы данных и получить некоторые данные. обработка с результатами голосования в моем приложении. В этом случае мне не нужны категории голосования. Они могут быть нулевыми.
Мой класс репозитория / DAO выглядит следующим образом
@Repository
public class UseCaseSpecificVoteRepositoryImpl implements UseCaseSpecificVoteRepository{
@PersistenceContext
EntityManager em;
@Override
@Transactional
public List<Vote> getAllVotesWithoutLoadingCategories() {
return (List<Vote>)em.createQuery("SELECT v FROM Vote v").getResultList();
}
}
Я настроил тест для UseCaseSpecificVoteRepositoryImpl, используя @ DataJpaTest
@DataJpaTest
class UseCaseSpecificVoteRepositoryImplTest {
@Autowired
UseCaseSpecificVoteRepositoryImpl repository;
@Autowired
TestEntityManager testEntityManager;
@Test
void getOneVoteById() {
//setup DB contents: insert 1 vote which has a c
Vote vote = new Vote();
vote.setCategory(testEntityManager.persist(new Category("kat1")));
vote = testEntityManager.persist(vote);
//load all votes from DB, but take only the first one (doesnt matter)
Vote fetchedVote = repository.getAllVotesWithoutLoadingCategories().get(0);
assertNull(fetchedVote.getCategory().getName());
}
}
Тест не пройден. fetchedVote будет содержать категорию, которую я установил ранее, и будет иметь имя «kat1». Я думаю, что это проблема: @DataJpaTests являются транзакционными, чтобы откатить все, что тест сделал с базовой базой данных H2. Хорошая идея. Однако Transactional на уровне модульного теста также означает, что все внутри моего модульного теста будет выполнено за один сеанс, так что один общий контекст постоянства (кеш). Когда я сохраняю объект A, а затем получаю объект A (выполненный с помощью моего вызова repository.getAllVotesWithoutLoadingCategories) внутри одного сеанса, get возвращает объект из контекста постоянства (кеша), не обращаясь к базе данных H2. И объект из контекста постоянства все еще имеет установленную категорию.
Мой вопрос, если мои предположения верны: как я могу проверить то, что я хочу проверить (с H2)? В чем смысл @ DataJpaTest , если не такие вещи?
PS: установка FetchType.LAZY в поле Категория ничего не меняет.