【发布时间】: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