Тестирование уровня сохраняемости в Spring Boot с помощью @DataJpaTest - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть объект с именем «Голосование», в котором есть поле «Категория», которое также является другим объектом.

@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 в поле Категория ничего не меняет.

...