将mockito-mocked bean注入Spring Boot bean以测试仍然加载依赖项

时间:2016-09-13 10:53:50

标签: spring unit-testing spring-boot mockito

这是我的测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={AseCalculatorApplicationImplTestConfig.class})
public class AseCalculatorApplicationImplTest {

    @Autowired
    AseCalculatorApplicationImpl aseCalculatorApplicationImpl;

    @Test
    public void test() {
        Assert.assertNotNull(aseCalculatorApplicationImpl);
    }
}

@Configuration
class AseCalculatorApplicationImplTestConfig {

    @Bean
    public StaticBean staticBean() {
        return Mockito.mock(StaticBean.class);
    }

    @Bean
    public JmsTemplate jmsTopicTemplate() {
        return Mockito.mock(JmsTemplate.class);
    }

    @Bean
    public AseCalculatorApplicationImpl aseCalculatorApplicationImpl() {
        return new AseCalculatorApplicationImpl();
    }
}

我的AseCalculatorApplicationImpl类有自动装配的bean(没有构造函数或setter,由refelection自动装配):

@Component
public class AseCalculatorApplicationImpl {

    @Autowired
    StaticBean staticBean;

    @Autowired
    JmsTemplate jmsTopicTemplate;

    [ ... omitted for brevity]

在My Static Bean中,它自动装配一个Hibernate Session Factory:

@Component
public class StaticBean {

    @Autowired
    private SessionFactory hibernateSessionFactory;

    [ ... omitted for brevity]

现在我的理解是我的AseCalculatorApplicationImplTestConfig将创建一个模拟StaticBean,它基本上是一个Mockito空shell,而不是使用类本身的任何代码/依赖/ bean。然而,我觉得我已经尝试过创建我的测试bean的每个变体,将它们注释为@MockBean,使用@InjectMocks注释我的Impl,但每次失败时都会:

org.springframework.beans.factory.NoSuchBeanDefinitionException: 
  No qualifying bean of type [org.hibernate.SessionFactory] found for dependency [org.hibernate.SessionFactory]

我知道我可以更改我的Impl类并且有一个标记为@Autowired的构造函数然后设置我的staticBean,但我喜欢它是多么干净,不必这样做。但是我无法弄清楚我的Test Config创建我的模拟Bean的错误 - 为什么它会在bean被模拟时尝试注入hibernateSessionFactory?

0 个答案:

没有答案