[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-test-kak-testirovat-repozitorii-s-pomoshchyu-datajpatest":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},700,"kak-testirovat-repozitorii-s-pomoshchyu-datajpatest",16,"spring-test","Spring Test","🧪","Как тестировать репозитории с помощью DataJpaTest?","`@DataJpaTest` — срезовая аннотация для тестирования JPA-репозиториев. Она загружает только компоненты, связанные с JPA (`@Entity`, `@Repository`, `EntityManager`), автоматически настраивает встроенную базу данных и применяет `@Transactional` с откатом после каждого теста.\n\n### Что делает DataJpaTest\n\n- Загружает только JPA-компоненты\n- Автоматически настраивает встроенную БД (H2, HSQLDB или Derby)\n- Применяет `@Transactional` с откатом\n- Не загружает `@Service`, `@Controller` и другие бины\n\n\u003Cdetails>\u003Csummary>Пример теста репозитория\u003C\u002Fsummary>\n\n```java\n@DataJpaTest\nclass UserRepositoryTest {\n\n    @Autowired\n    private UserRepository userRepository;\n\n    @Autowired\n    private TestEntityManager entityManager;\n\n    @Test\n    void shouldFindUserByEmail() {\n        User user = new User(\"Иван\", \"ivan@example.com\");\n        entityManager.persistAndFlush(user);\n\n        Optional\u003CUser> found = userRepository.findByEmail(\"ivan@example.com\");\n\n        assertTrue(found.isPresent());\n        assertEquals(\"Иван\", found.get().getName());\n    }\n\n    @Test\n    void shouldReturnEmptyWhenEmailNotFound() {\n        Optional\u003CUser> found = userRepository.findByEmail(\"unknown@example.com\");\n        assertTrue(found.isEmpty());\n    }\n\n    @Test\n    void shouldFindUsersByNameContaining() {\n        entityManager.persist(new User(\"Иванов Иван\", \"ivan@example.com\"));\n        entityManager.persist(new User(\"Иванова Мария\", \"maria@example.com\"));\n        entityManager.persist(new User(\"Петров Пётр\", \"petr@example.com\"));\n        entityManager.flush();\n\n        List\u003CUser> result = userRepository.findByNameContaining(\"Иванов\");\n\n        assertEquals(2, result.size());\n    }\n\n    @Test\n    void shouldSaveAndRetrieveUser() {\n        User user = new User(\"Тест\", \"test@example.com\");\n        User saved = userRepository.save(user);\n\n        entityManager.clear(); \u002F\u002F очищаем кэш первого уровня\n\n        User found = userRepository.findById(saved.getId()).orElseThrow();\n        assertEquals(\"Тест\", found.getName());\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Использование реальной БД вместо встроенной\n\n```java\n@DataJpaTest\n@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)\nclass UserRepositoryRealDbTest {\n    \u002F\u002F Использует реальную БД из application.properties\u002Fyml\n}\n```\n\nЗависимость H2 для тестов:\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.h2database\u003C\u002FgroupId>\n    \u003CartifactId>h2\u003C\u002FartifactId>\n    \u003Cscope>test\u003C\u002Fscope>\n\u003C\u002Fdependency>\n```\n\n> **На собеседовании:** важно объяснить, что `@DataJpaTest` — это slice-тест, который поднимает только JPA-слой, а не весь контекст. Частая ошибка — не упомянуть автоматический rollback и `TestEntityManager`.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Как тестировать репозитории с помощью DataJpaTest? — Gymterview","`@DataJpaTest` — срезовая аннотация для тестирования JPA-репозиториев. Она загружает только компоненты, связанные с JPA (`@Entity`, `@Repository`, `EntityManage","`@DataJpaTest` — срезовая аннотация для тестирования JPA-репозиториев. Она загружает только компоненты, связанные с JPA ",[7,13],"`@DataJpaTest` — срезовая аннотация для тестирования JPA-репозиториев. Она загружает только компоненты, связанные с JPA (`@Entity`, `@Repository`, `EntityManager`), автоматически настраивает встроенную базу данных и применяет `@Transactional` с откатом после каждого теста.",true]