Spring Data无法在测试

时间:2016-03-20 09:21:57

标签: intellij-idea spring-data

我刚刚开始学习spring-data,我在测试类中遇到了autowire存储库的问题

我创建了简单的maven结构

-src
--main
---java
----org.task.planner
-----config
-----entity
-----repository
-----service
--test
----org.task.planner

配置类(main / java / org / task / planner / config)正常工作

@Configuration
@EnableTransactionManagement
@ComponentScan("org.task.planner")
@PropertySource("classpath:app.properties")
@EnableJpaRepositories("org.task.planner.repository")
public class DataConfig {...}
存储库包中的

创建了TaskRepository

public interface TaskRepository extends JpaRepository<Task, Long> {
    Task findByName(String name);
}

我检查过这个bean已被实例化,可以从上下文中获取

public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(DataConfig.class);
    TaskRepository taskRepository = (TaskRepository) context.getBean("taskRepository");
    Task byName = taskRepository.findByName("someName");
}

但是在测试类中(位于测试包中)intellij idea会发出警告“无法自动装配。找不到'TaskRepository'类型的bean”,但测试工作正常......

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = DataConfig.class)
    public class TaskRepositoryTest {

        @Autowired
        private TaskRepository taskRepository;

        @Test
        public void shouldCreateTaskWithoutSubTask() {
            Task task = taskRepository.findByName("someName");
            assertEquals("description", task.getDescription());
        }
    }

这个问题可以使用@Repository注释来解决,如下所示:

    @Repository
    public interface TaskRepository extends JpaRepository<Task, Long> {
        Task findByName(String name);
    }

我无法得到它,我是否错误地配置了某些内容并且应该添加注释@Repository或者idea会给出错误的警告? (据我记得,这个注释用于自定义存储库)

2 个答案:

答案 0 :(得分:0)

您的DataConfig.class anotate with

@Configuration
@EnableTransactionManagement
@PropertySource("classpath:app.properties")
@ComponentScan("org.task.planner.repository") 

并添加TaskRepositoryTest.class @Transactional解剖,您还可以使用@Repository anotation使所有存储库类进行anotate

答案 1 :(得分:0)

您必须声明@Repository注释。但是,Custom存储库也将直接使用JpaRepository。因此,无论何时使用JpaRepository都必须使用@Repository注释进行声明。

根据此声明,可以扫描Spring,适当的组件可以通过autowire或setter wire连接它们。