@ -1,5 +1,5 @@
/ *
/ *
* Copyright 2012 - 20 19 the original author or authors .
* Copyright 2012 - 20 20 the original author or authors .
*
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* you may not use this file except in compliance with the License .
@ -16,12 +16,14 @@
package org.springframework.boot.autoconfigure.domain ;
package org.springframework.boot.autoconfigure.domain ;
import java.util.Collections ;
import java.util.Set ;
import java.util.Set ;
import javax.persistence.Embeddable ;
import javax.persistence.Embeddable ;
import javax.persistence.Entity ;
import javax.persistence.Entity ;
import org.junit.jupiter.api.Test ;
import org.junit.jupiter.api.Test ;
import org.mockito.ArgumentCaptor ;
import org.springframework.boot.autoconfigure.domain.scan.a.EmbeddableA ;
import org.springframework.boot.autoconfigure.domain.scan.a.EmbeddableA ;
import org.springframework.boot.autoconfigure.domain.scan.a.EntityA ;
import org.springframework.boot.autoconfigure.domain.scan.a.EntityA ;
@ -29,11 +31,18 @@ import org.springframework.boot.autoconfigure.domain.scan.b.EmbeddableB;
import org.springframework.boot.autoconfigure.domain.scan.b.EntityB ;
import org.springframework.boot.autoconfigure.domain.scan.b.EntityB ;
import org.springframework.boot.autoconfigure.domain.scan.c.EmbeddableC ;
import org.springframework.boot.autoconfigure.domain.scan.c.EmbeddableC ;
import org.springframework.boot.autoconfigure.domain.scan.c.EntityC ;
import org.springframework.boot.autoconfigure.domain.scan.c.EntityC ;
import org.springframework.context.ApplicationContext ;
import org.springframework.context.annotation.AnnotationConfigApplicationContext ;
import org.springframework.context.annotation.AnnotationConfigApplicationContext ;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider ;
import org.springframework.context.annotation.Configuration ;
import org.springframework.context.annotation.Configuration ;
import org.springframework.core.type.filter.AnnotationTypeFilter ;
import static org.assertj.core.api.Assertions.assertThat ;
import static org.assertj.core.api.Assertions.assertThat ;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException ;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException ;
import static org.mockito.BDDMockito.given ;
import static org.mockito.Mockito.mock ;
import static org.mockito.Mockito.verify ;
import static org.mockito.Mockito.verifyNoMoreInteractions ;
/ * *
/ * *
* Tests for { @link EntityScanner } .
* Tests for { @link EntityScanner } .
@ -79,6 +88,41 @@ class EntityScannerTests {
context . close ( ) ;
context . close ( ) ;
}
}
@Test
void scanShouldUseCustomCandidateComponentProvider ( ) throws ClassNotFoundException {
ClassPathScanningCandidateComponentProvider candidateComponentProvider = mock (
ClassPathScanningCandidateComponentProvider . class ) ;
given ( candidateComponentProvider . findCandidateComponents ( "org.springframework.boot.autoconfigure.domain.scan" ) )
. willReturn ( Collections . emptySet ( ) ) ;
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ( ScanConfig . class ) ;
TestEntityScanner scanner = new TestEntityScanner ( context , candidateComponentProvider ) ;
scanner . scan ( Entity . class ) ;
ArgumentCaptor < AnnotationTypeFilter > annotationTypeFilter = ArgumentCaptor . forClass ( AnnotationTypeFilter . class ) ;
verify ( candidateComponentProvider ) . addIncludeFilter ( annotationTypeFilter . capture ( ) ) ;
verify ( candidateComponentProvider )
. findCandidateComponents ( "org.springframework.boot.autoconfigure.domain.scan" ) ;
verifyNoMoreInteractions ( candidateComponentProvider ) ;
assertThat ( annotationTypeFilter . getValue ( ) . getAnnotationType ( ) ) . isEqualTo ( Entity . class ) ;
}
private static class TestEntityScanner extends EntityScanner {
private final ClassPathScanningCandidateComponentProvider candidateComponentProvider ;
TestEntityScanner ( ApplicationContext context ,
ClassPathScanningCandidateComponentProvider candidateComponentProvider ) {
super ( context ) ;
this . candidateComponentProvider = candidateComponentProvider ;
}
@Override
protected ClassPathScanningCandidateComponentProvider createClassPathScanningCandidateComponentProvider (
ApplicationContext context ) {
return this . candidateComponentProvider ;
}
}
@Configuration ( proxyBeanMethods = false )
@Configuration ( proxyBeanMethods = false )
@EntityScan ( "org.springframework.boot.autoconfigure.domain.scan" )
@EntityScan ( "org.springframework.boot.autoconfigure.domain.scan" )
static class ScanConfig {
static class ScanConfig {