【问题标题】:Repositories.getRepositoryFor() returns null in SpringBootTestRepositories.getRepositoryFor() 在 SpringBootTest 中返回 null
【发布时间】:2017-08-22 14:20:50
【问题描述】:

我的目标是测试注释处理器。为此,我决定在测试包中创建一些带有注释的测试数据。我的注释处理器使用 Spring Repositories,但它们每次都返回 null,即使存储库存在。在调试中,我注意到我的存储库在 applicationContext 中不存在。 如何强制 Spring 查看我的存储库?

我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AnnotationConfigWebApplicationContext.class, 
RepoConfig.class, AnnotationProcessor.class}, loader = AnnotationConfigContextLoader.class)
public class AnnotationProcessorTest{

@Autowired
private AnnotationProcessor processor;

@Test
public void test(){
    assertNotNull(processor.getRepositories()); //Repositories is empty
}
}

存储库:

@Repository
public interface MyRepository extends PagingAndSortingRepository<MyClass, 
Serializable> {
}

我的班级:

@Entity
public class MyClass implements Serializable{

    @Id
    private String ref;

    private String field;
}

回购配置:

@Configuration
@EnableJpaRepositories(basePackageClasses = {MyRepository.class})
public class RepoConfig{
}

注解处理器:

@Component
public class AnnotationProcessor{

    @Autowired
    private WebApplicationContext appContext;

    private Repositories repositories;


    @PostConstruct
    public void init() {
       repositories = new Repositories(appContext);

       ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
       scanner.addIncludeFilter(new AnnotationTypeFilter(Repository.class, false, false));
    scanner.findCandidateComponents("com").forEach(this::processRepository);
    }

    private void processRepository(BeanDefinition bean) {
        Class<?> repoClass = Class.forName(bean.getBeanClassName());
        Repository annotation = repoClass.getAnnotation(Repository.class);
        //TODO: processing annotation
    }

    public Repositories getRepositories(){
         return repositories;
    }
}

【问题讨论】:

  • 什么是AnnotationProcessor?
  • AnnotationProcessor 是一个自定义类,用于处理来自 MyClass 的注释并生成特定的元数据。那里有很多逻辑,但它崩溃了,因为在应用程序上下文中找不到任何存储库。
  • 请包含该代码。
  • AnnotationProcessor 示例已添加。

标签: testing spring-boot junit


【解决方案1】:

这是填充Repositories 对象的类的工作版本。

@Component
public class RepositoryConfigurer {
    private Repositories repositories;

    @Autowired
    public RepositoryConfigurer(ApplicationContext applicationContext) {
        this.repositories = new Repositories(applicationContext);
    }

    public Repositories getRepositories() {
        return this.repositories;
    }
}

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ApplicationTests {

    @Autowired
    ApplicationContext appContext;

    @Autowired
    RepositoryConfigurer repositoryConfigurer;

    @Test
    public void testRepositoriesConfigurer() {
        assertThat(repositoryConfigurer).isNotNull();

        Repositories repositories = repositoryConfigurer.getRepositories();
        assertThat(repositories).isNotNull();

        repositories.forEach(repository -> {
            System.out.println(repository.getName());
        });
    }
}

包括项目供参考。 spring-boot-tests

【讨论】:

  • 我的项目中没有 SpringBootApplication 类:(
  • 您使用的是哪个版本的 spring-boot?你能设置一个 github repo 来展示你的项目吗?
  • 通过添加 SpringBootApplication 类解决了该问题。谢谢!
猜你喜欢
  • 2019-03-09
  • 2021-08-18
  • 2022-11-22
  • 2011-12-30
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多