Java 在JUnit中通过自动连接创建实现JpaRepo接口的对象?

Java 在JUnit中通过自动连接创建实现JpaRepo接口的对象?,java,spring-mvc,junit,spring-data-jpa,autowired,Java,Spring Mvc,Junit,Spring Data Jpa,Autowired,我的任务是编写JUnit类。为此,我需要创建一个对象,该对象实现一个扩展org.springframework.data.jpa.repository.JpaRepository(称为“KanjiRepo”)的接口,但该应用程序中没有实际实现KanjiRepo的类 所有实现KanjiRepo的对象似乎都是通过@Autowiring创建的,而不是使用new KanjiRepo接口是只有接口的包的成员,它们都扩展了org.springframework.data.jpa.repository.Jpa

我的任务是编写JUnit类。为此,我需要创建一个对象,该对象实现一个扩展org.springframework.data.jpa.repository.JpaRepository(称为“KanjiRepo”)的接口,但该应用程序中没有实际实现KanjiRepo的类

所有实现KanjiRepo的对象似乎都是通过@Autowiring创建的,而不是使用new

KanjiRepo接口是只有接口的包的成员,它们都扩展了org.springframework.data.jpa.repository.JpaRepository

@Repository
public interface KanjiRepo extends JpaRepository....

[问题]我认为我不理解这个问题。有人能告诉我我刚才说的是否正确吗。在我的junit中,我是否也使用@Autowire来创建在与KanjiRepo相同的包中实现接口的对象?最后一步需要维护两个单独的应用程序上下文?

我认为在测试类中,自动连接KanjiRepo就足够了,除非您将存储库注释为@repository

@Repository
public interface KanjiRepo extends JpaRepository....
如果您在KanjiRepo顶部有@Repository注释,并且如果您将主类或配置类注释为自动扫描bean;spring将成功地创建和自动连接bean

请检查组件扫描

@SpringBootApplication
// or  @ComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
然后,您可以使用以下代码创建测试类:

@Autowired
KanjiRepo repo;

@Test
public void testFindById() {
    Kanji instance = repo.findById(0L);
    assert.....
}
应该没问题

应用程序和JUnit能否共享相同的配置文件

事实上,是的。但是,如果你做组件扫描,你不必担心。Spring将处理bean所在的位置,它将成功地自动连线

我是否也使用@Autowire来创建实现与KanjiRepo相同包中的接口的对象


Spring将执行组件扫描并找到存储库所在的位置,因此,您不必担心存储库的位置。

Spring Data在运行时创建任何已配置存储库接口的实现。如果您的测试在Spring上下文中运行,那么您只需使用
@Autowired SomeRepoInterface
在测试执行时注入生成的实现。
@Repository
public interface KanjiRepo extends JpaRepository....