用@DataJpaTest注释的测试未使用@Autowired注释的自动装配字段

时间:2019-10-30 22:14:24

标签: java spring spring-boot spring-data-jpa

我有一个Spring Boot应用程序,其中包含一个Spring Data Jpa存储库。我需要围绕该存储库运行单元(或组件?)测试。我对Spring Data Jpa经验不足。

这是我的考试。这很简单,我无法通过。

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.junit.Assert.assertNotNull;

@DataJpaTest
public class FooRepositoryTest {

    @Autowired
    private FooRepository fooRepo;

    @Test
    public void notNull(){
        assertNotNull(fooRepo);
    }
}

这是其他相关的源代码。

import com.fedex.dockmaintenancetool.webservice.types.Foo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface FooRepository extends JpaRepository<Foo, Long> {
}

import javax.persistence.Entity;

@Entity
public class Foo {
}

只是试图将Jpa存储库自动连接到测试中,但我做不到。显然,我误解了Spring Boot的工作原理。但是即使经过一些教程,我也无法弄清楚我所缺少的东西。有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

您缺少@RunWith(SpringRunner.class)注释,该注释告诉JUnit实际上启动测试的Spring应用程序。

您的测试班级应该看起来像

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertNotNull;

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

    @Autowired
    private FooRepository fooRepo;

    @Test
    public void notNull(){
        assertNotNull(fooRepo);
    }
}

问题中使用的JUnit版本仍然是JUnit 4。 Spring Boot 2.2.0切换到JUnit5。

使用JUnit5,您将不得不使用@ExtendWith(SpringExtension.class)而不是@RunWith(SpringRunner.class)

答案 1 :(得分:1)

使用注释@DataJpaTest时,这意味着您尝试仅测试存储库层。该批注用于测试JPA存储库,并与@RunWith(SpringRunner.class)结合使用,以填充应用程序上下文。 @DataJpaTest注释会禁用完全自动配置,并且仅应用与JPA测试相关的配置。因此@fap siggested可以像这样使用它:

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

    @Autowired
    private FooRepository fooRepo;

    @Test
    public void notNull(){
        assertNotNull(fooRepo);
    }
}

当您使用注释@RunWith(SpringRunner.class)时,SpringRunner支持加载Spring ApplicationContext并将bean @Autowired放入测试实例。