Прежде чем запустить тест, давайте удостоверимся, что основное приложение работает.На самом деле, у него есть некоторые проблемы.
1.IllegalArgumentException
: Неуправляемый тип: класс com.example.demo.entity.Student
.
Проблема: @EntityScan("com.example.demo.entity.*")
.Имя пакета неверно, поэтому класс Student
не сканируется.
Решение: @EntityScan("com.example.demo.entity")
.
2.PropertyReferenceException
: свойство attributeContainsText
не найдено для типа Student
!
Проблема в том, что базовый класс хранилища не установлен , и JpaQueryLookupStrategy
считает, что он должен создатьRepositoryQuery
из названия метода findByAttributeContainsText
.Он распознает шаблон findBy{EntityPropertyName}
и не может найти поле attributeContainsText
в Student
.
Базовый класс хранилища не задан, поскольку конфигурация StudentJPAH2Config
не применяется.Конфигурация не применяется, если она не может быть сканирована.@ComponentScan("com.example.demo.dao")
не сканирует пакет, в котором находится StudentJPAH2Config
.
Решение - @ComponentScan("com.example.demo")
, которое будет сканировать пакеты "com.example.demo"
и "com.example.demo.dao"
1 .
Теперь, когда приложение в порядке, давайтевернитесь к тесту.
3.NoSuchBeanDefinitionException
: нет доступных компонентов типа com.example.demo.dao.ExtendedStudentRepository
.
Проблема в том, что StudentJPAH2Config
не составляет всю конфигурацию , а некоторые компоненты отсутствуют.
Решение состоит в том, чтобы перечислить все классы конфигурации.
@ContextConfiguration(classes = { StudentJPAH2Config.class, DemoApplication.class })
или
@ContextConfiguration(classes = DemoApplication.class)
или
@SpringBootTest
4.JpaSystemException
: Нет конструктора по умолчанию для сущности com.example.demo.entity.Student
.
Проблема в том, что Hibernate 2 требует конструктор по умолчанию для Student
:
@Entity
public class Student {
@Id
private long id;
private String name;
public Student() {}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
// getters & setters
}
1 @ComponentScan("com.example.demo.dao")
является избыточным, поскольку этот пакет будет сканироваться из-за наличия @SpringBootApplication
.
2 Hibernate является поставщиком JPA по умолчанию в приложениях Spring.