【问题标题】:@SpringBootTest not creating inner beans while loading the context@SpringBootTest 在加载上下文时不创建内部bean
【发布时间】:2017-08-05 14:04:26
【问题描述】:

我想了解为什么在尝试如下测试时未创建内部 bean:

RunWith(SpringRunner.class)
@SpringBootTest(classes=MyTest.class)
public class MyTest {

     @SpyBean A a;



     @Test
     public  void  myTest() {   
       assertTrue(a.some());       
     }


    @Component
    class A {
      private B b;
      A(B dependency) {
        this.b = dependency;
      }
      boolean some() {
        return b.value();
      }
    }

    @Configuration
    class B {


      boolean value() { return true; }
    }

}

错误:No qualifying bean of type 'com.example.MyTest$B' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:

尽管用@Configuration 注释了内部类,但在测试方法时并没有创建bean。

请注意,当我添加如下 @SpringBootTest(classes=MyTest.class,MyTest.B.class,MyTest.A.class}) 时,它会起作用

【问题讨论】:

  • 内部@Configuration 类应该是public static

标签: spring spring-boot junit spring-test


【解决方案1】:

@ContextConfiguration(classes = MyTest.B.class) 添加到 MyTest 类。
但 将配置放入测试类并不是最好的主意。最好创建单独的配置类MyTestConfig 来创建测试所需的所有bean,并由@ContextConfiguration(classes = MyTestConfig.class) 在测试类中使用它。

【讨论】:

【解决方案2】:

使用@MockBean。并在@Test 中添加行为:

@SpringBootTest
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)      
public abstract class IntegrationTest {

  @MockBean
  A a;

  @Test
  public void mySuperTest(){ 
Mockito.when(a.getById(Mockito.any())).thenReturn(someInstance);
Assert.assertEquals(a.getById("id"), someInstance);
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多