Spring @DataJpaTest генерирует исключение с неизвестной сущностью - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь создать тест репозитория с аннотацией Spring @DataJpaTest. Даже с простым демонстрационным проектом я получаю IllegalArgumentException: Unknown entity. Я что-то пропустил?

Я использую пример Baeldung для тестирования с помощью Spring. Существует простой @DataJpaTest, и я применил его к своему коду. При выполнении теста я получил исключение IllegalArgumentException: Unknown entity, что сам репозиторий не может быть найден. Поэтому я создал демонстрационный проект с минимально необходимыми классами и все еще получил эту ошибку.

класс сущности:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class DemoEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String name;

  // getter and setter
}

класс хранилища:

@Repository
public interface DemoRepository extends JpaRepository<DemoEntity, Long> {

    Optional<DemoEntity> findByName(String name);
}

и тестовый класс:

@RunWith(SpringRunner.class)
@DataJpaTest
public class DemoRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private DemoRepository repository;

    @Test
    public void test() {
        DemoEntity demo = new DemoEntity() {{
            setName("Tim");
        }};

        entityManager.persistAndFlush(demo);

        Optional<DemoEntity> result = repository.findByName("Tim");

        assertThat(result.isPresent()).isTrue();
    }
}

Результат теста: исключение:

java.lang.IllegalArgumentException: Unknown entity: com.example.demo.repositories.DemoRepositoryTest$1

at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:804)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:785)
at org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager.persist(TestEntityManager.java:93)
at org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager.persistAndFlush(TestEntityManager.java:131)
at com.example.demo.repositories.DemoRepositoryTest.test(DemoRepositoryTest.java:31)

Я использую Spring Boot Starter 2.1.1 и Java 10.

1 Ответ

0 голосов
/ 02 января 2019

Проблема связана с тем, как вы создаете экземпляр DemoEntity:

DemoEntity demo = new DemoEntity() {{
        setName("Tim");
    }};

Не используйте синтаксис инициализации с двойными скобками, и он должен работать нормально.

Таким образом вы создаете подкласс DemoEntity. Это то, что сообщение об ошибке также указывает с $1 в конце

См. https://stackoverflow.com/a/27521360/40064 для получения дополнительной информации о том, почему в любом случае это плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...