如何为具有自动装配依赖项的 class 创建模拟 spring bean

How to create a mock spring bean for a class having autowired dependencies

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

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 来实现。但这不是我想要的解决方案。

我的要求是创建 MainClass 的模拟 bean,而不创建 AutowiredClass 的实际 bean。请帮助我如何实现这一目标。

正如 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 class 不在maven中,你需要将它复制到你的项目中。

文档是 here