我正在尝试使用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。
答案 0 :(得分:2)
问题是由于您创建DemoEntity
实例的方式引起的:
DemoEntity demo = new DemoEntity() {{
setName("Tim");
}};
不要使用双括号初始化语法,它应该可以正常工作。
您正在以这种方式创建DemoEntity
的子类。这也是错误消息结尾处带有$1
的内容
有关https://stackoverflow.com/a/27521360/40064为何仍然是个坏主意的更多信息,请参见re-using an entity's ID for other entities of different kinds - sane idea?。