2017-08-22 8 views
0

私の目標は注釈プロセッサをテストすることです。これを行うために、私は、テストパッケージ内の注釈でいくつかのテストデータを作成することに決めました。私の注釈プロセッサはSpringリポジトリを使用しますが、リポジトリが存在する場合でも毎回nullを返します。デバッグでは、私のリポジトリがapplicationContextに存在しないことに気付きました。 Springに私のリポジトリを強制的に見せることができますか?Repositories.getRepositoryFor()はSpringBootTestでnullを返します

私のテスト:

@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> { 
} 

MyClassの:

@Entity 
public class MyClass implements Serializable{ 

    @Id 
    private String ref; 

    private String field; 
} 

RepoConfig:

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

AnnotationProcessor:ここ

@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; 
    } 
} 
+0

AnnotationProcessorとは何ですか? – ryan2049

+0

AnnotationProcessorは、MyClassのアノテーションを処理して特定のメタデータを生成するカスタムクラスです。そこには多くのロジックがありますが、アプリケーションコンテキストでリポジトリが見つからないためクラッシュします。 –

+0

そのコードを含めてください。 – ryan2049

答えて

0

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

+0

私のプロジェクトにSpringBootApplicationクラスがありません:( –

+0

あなたはどのバージョンのSpringブートを使用していますか?プロジェクトを表示するgithubリポジトリを設定できますか? – ryan2049

+0

SpringBootApplicationクラスを追加することで問題は解決しました。 –

関連する問題