Существует класс Монго Дао com.foo.bar.dao.CompanyRecommendationDao
, и существует соответствующий класс тестирования: com.foo.bar.dao.CompanyRecommendationDaoTest
.
@RunWith(SpringRunner.class)
@DataMongoTest(includeFilters = @ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,value={CompanyRecommendationDao.class}))
@Import(SpringMongoConfig.class)
public class CompanyRecommendationDaoTest
При первом запуске тестовый класс в порядке, но если добавить аннотацию ComponentScan
над классом приложения
@SpringBootApplication
@ComponentScan("com.foo")
public class BarApplication
, в этом случае при запуске CompanyRecommendationDaoTest может получиться ошибка ниже
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'companyManagementService': Unsatisfied dependency expressed through field 'companyMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'companyMapper' defined in file [/Users/zhugw/develop/workspace/bar/target/classes/com/foo/bar/mapper/CompanyMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
Так почему же он может загружать другой класс обслуживания, должен ли он загружать только класс, связанный с монго?
From DataMongoTest
javadoc
Может использоваться, когда тест фокусируется только на компонентах MongoDB.Использование этой аннотации отключит полную автоконфигурацию и вместо этого будет применять только конфигурацию, относящуюся к тестам MongoDB.
Какая разница, если явно добавить @ComponentScan ("com.foo") (по умолчанию используется пакет com.foo.bar)?
PS.При включении журнала трассировки
Ситуация 1 (без @ComponnetScan)
2019-06-02 22:28:08.876 TRACE 13875 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning file [/Users/zhugw/develop/workspace/foo/bar/target/classes/com/foo/bar/dao/CompanyRecommendationDao.class]
2019-06-02 22:28:08.877 TRACE 13875 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'org.springframework.boot.test.context.filter.TestTypeExcludeFilter'
2019-06-02 22:28:08.877 TRACE 13875 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'org.springframework.boot.test.autoconfigure.filter.TypeExcludeFilters'
2019-06-02 22:28:08.877 DEBUG 13875 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Identified candidate component class: file [/Users/zhugw/develop/workspace/foo/bar/target/classes/com/foo/bar/dao/CompanyRecommendationDao.class]
Ситуация 2 (с @ComponnetScan)
2019-06-02 22:40:23.989 TRACE 14573 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning file [/Users/zhugw/develop/workspace/foo/bar/target/classes/com/foo/bar/dao/CompanyRecommendationDao.class]
2019-06-02 22:40:23.989 DEBUG 14573 --- [ main] o.s.c.a.ClassPathBeanDefinitionScanner : Identified candidate component class: file [/Users/zhugw/develop/workspace/foo/bar/target/classes/com/foo/bar/dao/CompanyRecommendationDao.class]