如何加载mongo存储库以测试应用程序上下文?

时间:2019-04-25 08:58:37

标签: spring spring-data-mongodb spring-test

我必须对某些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)

1 个答案:

答案 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。