如何为具有自动连接依赖项的类创建模拟spring bean

时间:2015-10-28 12:36:04

标签: java spring unit-testing junit mocking

假设我有一个名为MainClass的类。

public class MainClass {
    @Autowired
    AutoWiredClass autoWiredClass;
}

我正在尝试使用Mockito创建一个MainClass的模拟bean。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class AutowiringTest {
    @Configuration
    static class AutowiringTestConfiguration{

        @Bean
        public MainClass mainClass() {
            return Mockito.mock(MainClass.class);
        }
    }

    @Autowired
    MainClass mainClass;

    @Test
    public void testBeanCreation(){
        assertNotNull(mainClass);
    }
}

运行测试用例时出现此错误。

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: autowiring.AutoWiredClass autowiring.MainClass.autoWiredClass; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [autowiring.AutoWiredClass] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我知道我可以使用@Mock和@InjectMocks实现这一目标。但那不是我想要的解决方案。

我的要求是在不创建AutowiredClass的实际bean的情况下创建MainClass的模拟bean。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

正如Florian已经评论过的那样,你应该尝试创建完全不需要Spring的测试,你就不会遇到这些问题。

但是,如果没有可行的解决方法,您可以使用AutoMockRegistryPostProcessor的一些魔法。

您只需要将AutoMockRegistryPostProcessor添加到@ContextConfiguration,它就会为您缺少的依赖项创建模拟:

@ContextConfiguration(classes = { AutowiringTest.class, AutoMockRegistryPostProcessor.class })
public class AutowiringTest {
    // no complains anymore, a mockito mock will be created for AutoWiredClass

AutoMockRegistryPostProcessor类不在maven中,您需要在项目中复制它。

文件是here