我必须为一些弹簧应用程序实现一些测试。我在测试中使用@SpringBootTest注释:
@SpringBootTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTest(){
//some tests...
}
它工作正常,但我不想加载所有应用程序上下文,并通过添加一个或多个nessecary配置类来限制它。我用@ContextHierarchy完成了它:
@SpringBootTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ContextHierarchy(ContextConfiguration(classes = [SomeCofigClass1::class, SomeConfigClass2::class]))
class MyTest(){
//some tests...
}
//for example
class SomeCofigClass1(){
@Bean
fun(someMongoRepository: SomeMongoRepository){ \\<-- Problem is here
return SomeService(someMongoRepository)
}
}
/**
* My repository.
*/
interface SomeMongoRepository : MongoRepository<Job, String> {}
由于上下文部分加载,我得到一个错误:
No qualifying bean of type 'SomeMongoRepository' available:....
如何在测试应用程序上下文中加载存储库?
我已经尝试过:
1)添加了@AutoConfigureDataMongo。我收到错误java.lang.IllegalStateException:无法检索@EnableAutoConfiguration基础包
@SpringBootTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ContextHierarchy(ContextConfiguration(classes = [SomeCofigClass1::class, SomeConfigClass2::class]))
@AutoConfigureDataMongo
2)用@DataMongoTest替换@SpringBootTest。我收到错误无法检索@EnableAutoConfiguration基础包
@DataMongoTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@ContextHierarchy(ContextConfiguration(classes = [SomeCofigClass1::class, SomeConfigClass2::class]))
3)@DataMongoTest用@Import替换@ContextHierarchy。使用@Import注释,它会加载所有应用程序上下文。这不适合我。
@DataMongoTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@Import(SomeCofigClass1::class, SomeConfigClass2::class)
添加@RunWith(SpringRunner.class)
以在测试期间加载Spring的ApplicationContext。
此外,可以使用@SpringBootTest#classes
属性(或@ContextConfiguration)
:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SomeCofigClass1.class, SomeConfigClass2.class})
如果您的测试使用内部配置类,请确保将它们设为static(并添加@Configuration
)。从文档:
如果省略@ContextConfiguration批注中的classes属性,TestContext框架将尝试检测是否存在默认配置类。具体来说,AnnotationConfigContextLoader和AnnotationConfigWebContextLoader将检测满足配置类实现要求的测试类的所有静态嵌套类,如@Configuration javadoc中所指定。