@DataJpaTest中的存储库已初始化为null

时间:2018-08-01 18:57:22

标签: java spring-boot junit

我试图在我的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下。我尝试对包装名称进行一些更改,但这没有帮助,所以我不知道现在出了什么问题。为什么仓库会初始化为空?

2 个答案:

答案 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)

这是另一个类似的问题:Spring test with @DataJpaTest can't autowire class with @Repository (but with interface repository works!)

答案 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);
    } 
}