我必须对某些spring应用程序进行一些测试。我在测试中使用@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)将@SpringBootTest替换为@DataMongoTest。我收到错误无法检索@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)
答案 0 :(得分:0)
添加@RunWith(SpringRunner.class)
以在测试期间加载Spring的ApplicationContext。
此外,可以使用@SpringBootTest#classes
属性(或@ContextConfiguration)
:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SomeCofigClass1.class, SomeConfigClass2.class})
如果您的测试使用内部Configuration类,请确保将它们设置为static(并添加@Configuration
)。从文档中:
如果您从@ContextConfiguration批注中省略了classes属性,则TestContext框架将尝试检测是否存在以下内容: 默认配置类。特别, AnnotationConfigContextLoader和AnnotationConfigWebContextLoader 检测符合条件的测试类的所有静态嵌套类 配置类实现的要求,如 @Configuration javadoc。