将mockitomockbeans注入springbootbean以测试静态负载依赖性

将mockitomockbeans注入springbootbean以测试静态负载依赖性,spring,unit-testing,spring-boot,mockito,Spring,Unit Testing,Spring Boot,Mockito,这是我的测试课: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes={AseCalculatorApplicationImplTestConfig.class}) public class AseCalculatorApplicationImplTest { @Autowired AseCalculatorApplicationImpl aseCalculatorApplicationIm

这是我的测试课:

@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自动连接):

在我的静态Bean中,它自动连接一个Hibernate会话工厂:

@Component
public class StaticBean {

    @Autowired
    private SessionFactory hibernateSessionFactory;

    [ ... omitted for brevity]
现在我的理解是,我的AseCalculatorApplicationImpletsConfig将创建一个模拟StaticBean,它基本上是一个Mockito空壳,而不使用类本身的任何代码/依赖项/bean。然而,我觉得我已经尝试了创建测试bean的各种方法,将它们注释为@MockBean,将Impl注释为@InjectMocks,但每次都失败了:

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

我知道我可以改变我的Impl类,让一个构造函数标记为@Autowired,然后设置我的staticBean,但我喜欢它是多么干净,不必这样做。但是我不知道我的测试配置在创建模拟bean时犯了什么错误-为什么它试图在bean被模拟时注入hibernateSessionFactory???

你的理解是错误的。是的,从功能的角度来看,它是一个空壳。它仍然使用相同的类定义(mockito只是用动态类扩展了您自己的类!),因此所有注释和字段仍然存在。因为它是一个spirng管理的bean,所以这些仍然会被处理。啊,我认为Spring是管理注释的那个,通过将Mockito mock类作为bean返回,Spring将永远不会查看类本身内部(即注释)。那么解决方案是什么呢?为任何模拟bean中的每个自动连接字段创建一个模拟bean(递归)?我假设Spring的聪明人已经解决了这个问题?或者我的应用程序设计得很糟糕,这就是我遇到这个问题的原因?为bean创建一个接口,并在接口上创建一个模拟,而不是类。你的理解是错误的。是的,从功能的角度来看,它是一个空壳。它仍然使用相同的类定义(mockito只是用动态类扩展了您自己的类!),因此所有注释和字段仍然存在。因为它是一个spirng管理的bean,所以这些仍然会被处理。啊,我认为Spring是管理注释的那个,通过将Mockito mock类作为bean返回,Spring将永远不会查看类本身内部(即注释)。那么解决方案是什么呢?为任何模拟bean中的每个自动连接字段创建一个模拟bean(递归)?我假设Spring的聪明人已经解决了这个问题?或者我的应用程序设计得很糟糕,这就是我遇到这个问题的原因吗?为bean创建一个接口,并在接口上创建一个Mock,而不是类
org.springframework.beans.factory.NoSuchBeanDefinitionException: 
  No qualifying bean of type [org.hibernate.SessionFactory] found for dependency [org.hibernate.SessionFactory]