当前位置: 首页 > 知识库问答 >
问题:

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

季凡
2023-03-14

我有一个Spring Boot应用程序,其中包含一个Spring数据Jpa存储库。我需要运行一个单元(或组件?)围绕此存储库进行测试。我对Spring数据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个答案

凌博实
2023-03-14

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

你的测试课应该看起来像

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中,您必须使用@Exantwith(SpringExtension.class)而不是@Runwith(SpringRunner.class)。因为@JpaTest已经用@ExantsAnd注释了,所以您不必实际包含它,请参见https://stackoverflow.com/a/65359510/4266296.

笪欣嘉
2023-03-14

当您使用注释DataJpaTest时,这意味着您正在尝试只测试存储库层。注释用于测试JPA存储库,并与RunWith(SpringRunner.class)结合使用,以支持填充应用程序上下文。注释禁用完全自动配置,仅应用与JPA测试相关的配置。因此,正如@fap所暗示的那样使用它:

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

    @Autowired
    private FooRepository fooRepo;

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

当您使用注释@RunAnd(SpringRunner.class)时,SpringRunner提供了对加载Spring Application ationContext并将bean@Autowire加载到您的测试实例中的支持。

 类似资料:
  • 另外,请举例说明何时使用annotaion。 提前感谢。

  • 我正在学习SpringBoot,在参考文档中有一个例子,我有一个问题。文件的以下部分提到 6.使用@SpringBootApplication注释 可以使用单个@SpringBootApplication注释来启用这三个功能,即: @EnableAutoConfiguration:启用Spring Boot的自动配置机制 @ComponentScan:在应用程序所在的包上启用@Component扫

  • 我有一把刀: 问题是,当我试图使用DAO进行加载调用时,使用DynamoDBMapper以field d1作为哈希键来获取项目,它会抛出一个DynamoDBExc0019,说:为公共DAO. getField2()找到了空键,但实际上表的值对应于field d2。问题,这是因为Lombok注释而不是手动突变代码,还是一般来说我们一起使用Lombok和DynamoDBAnnotions?

  • 问题内容: 我正在看工作区中的一些旧示例。由于没有 @Autowired, 我看不到自动 装配的方式 。Spring Boot + Facebook默认配置。 它工作完美,但是这些bean如何在没有@Autowired的情况下自动进行自动连线? 它们是作为字段或在构造函数中自动接线的吗? 问题答案: 借助Spring Boot 1.4+,构造函数将自动进行自动接线 https://docs.spr

  • 我找到了一些答案:https://stackoverflow.com/a/21218921/2754014 关于依赖注入。没有任何注释,如,或。让我们假设此示例没有任何 XML 配置 的 bean (除了简单

  • 我发现了几个与此相关的(不是重复的)问题,但它们不能让我满意。 我无法理解在哪里以及为什么要使用? 我在一本书中读到了一个自定义注释的示例,但没有详细解释。 myMeth()内的输出与预期一致。 关于这个例子,我有几个问题。 1-如何在此程序中使用和?或