我试图在我的Spring Boot应用程序中为某个存储库编写一些测试,但是该存储库被自动连接为 null 。测试类的代码如下:
package jpa.project.repo;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.ContextConfiguration;
import jpa.project.entity.Person;
@EnableAutoConfiguration
@ContextConfiguration(classes = PersonRepo.class)
@DataJpaTest
public class PersonRepoTest {
@Autowired
private PersonRepo personRepoTest;
@Test
public void testPersonRepo() throws Exception {
Person toSave = new Person();
toSave.setPersonId(23);
if (personRepoTest == null) {
System.out.println("NULL REPO FOUND");
}
personRepoTest.save(toSave);
Person getFromDb = personRepoTest.findOne(23);
Assert.assertTrue(getFromDb.getPersonId() == 23);
}
}
当我在Eclipse中作为JUnit测试运行该文件时,print语句确实得到打印,这确认了随后出现的nullpointerexception。我所有的测试都与主应用程序位于相同的软件包中,但这些软件包位于src / test / java下。我尝试对包装名称进行一些更改,但这没有帮助,所以我不知道现在出了什么问题。为什么仓库会初始化为空?
答案 0 :(得分:2)
使用像 @DataJpaTest 这样的测试切片时的问题是Spring Boot将仅加载一组特定的类。请参阅Spring文档中的这一部分:
如果要测试JPA应用程序,可以使用@DataJpaTest。默认情况下,它将配置一个内存嵌入式数据库,扫描@Entity类并配置Spring Data JPA存储库。常规@Component bean将不会加载到ApplicationContext中。
@Repository 被认为是常规的 @Component ,因为它不是Spring Data JPA存储库(接口是)。因此,它没有被加载。默认情况下,仅会加载存储库接口,如下所示:
public interface PersonRepo extends JpaRepository<Person, Long> {
...
}
为解决您的问题,您可以强制 @DataJpaTest 加载所有您的 @Repository 类:
@DataJpaTest(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Repository.class))
或者只是将需要的@Repository类导入到测试中:
@Import(PersonRepo.class)
答案 1 :(得分:0)
这是使用@DataJpaTest和TestEntityManager进行单元测试的有效示例:
PersonRepo扩展了JpaRepository并具有@Repository批注
我正在我的项目中使用这种方法,如果所有配置均有效并且应用程序可以正常运行,则测试将通过。
@RunWith(SpringRunner.class)
@DataJpaTest
public class RepositoryTest {
@Autowired
TestEntityManager entityManager;
@Autowired
PersonRepo sut;
@Test
public void some_test() {
Person toSave = new Person();
toSave.setPersonId(23);
entityManager.persistAndFlush(toSave);
Person getFromDb = sut.findOne(23);
Assert.assertTrue(getFromDb.getPersonId() == 23);
}
}