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

Java 如何为具有自动连接依赖项的类创建模拟Springbean,java,spring,unit-testing,junit,mocking,Java,Spring,Unit Testing,Junit,Mocking,假设我有一个名为MainClass的类 public class MainClass { @Autowired AutoWiredClass autoWiredClass; } 我正在尝试使用Mockito创建MainClass的模拟bean @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class AutowiringTest { @Configuration stat

假设我有一个名为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和@injectmock实现这一点。但这不是我想要的解决方案


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

正如Florian所评论的,您应该尝试创建完全不需要Spring的测试,这样您就不会有这些问题

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

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

@ContextConfiguration(classes = { AutowiringTest.class, AutoMockRegistryPostProcessor.class })
public class AutowiringTest {
    // no complains anymore, a mockito mock will be created for AutoWiredClass
AutoMockRegistryPostProcessor
类不在maven中,您需要在项目中复制它


文档是。

如果您只想创建一个模拟MainClass,那么您需要整个Spring做什么?一个mock将不会包含任何其他内容…我只是给出了一个示例。我有一个用例,我想测试的类有多个@Autowired字段。我希望它们中的一些来自spring,另一些被嘲笑。但是在这种情况下,主类本身不能是一个嘲笑,这里似乎就是这样。您可以将模拟放在not mock中,但另一种方法并不经常发生,而且会有点困难,可能需要一个应答对象,该对象将一些调用重定向到模拟,另一些重定向到真实对象。@FlorianSchaetz,是的。在我的用例中,MainClass不是一个模拟类。Mainclass中的某些依赖项需要模拟。我举这个例子是为了简化问题。如果回答了这个问题,我的用例也将实现。在这种情况下,让MainClass使用构造函数或setter注入,然后@Autowired将需要自动连接到testcase的对象自动连接到testcase中,创建Mock并使用所有这些对象手动构造MainClass的实例。这不起作用。后处理器未处理MainClass bean<代码>字符串[]beanNames=registry.getBeanDefinitionNames();System.out.println(array.toString(beanNames))结果没有将mainClass作为bean之一。这是print语句的结果<代码>[org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,autowiringTest,AutomockRegistryPostrocessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.EnhancedConfiguration Processor]成功了。我忘了在@ContextConfiguration中添加AutowiringTest.class。但是我可以知道为什么需要这样做吗?mainclassbean已经在没有更改的情况下创建了。一个空的
@ContextConfiguration
尝试自己查找配置类,它会找到您的
AutowiringTestConfiguration
。只要您在
@ContextConfiguration
中指定一个类(您需要这样做才能添加
AutoMockRegistryPostProcessor
),您正在覆盖自动发现,需要自己显式添加配置类。@Ruben您的
AutoMockRegistryPostProcessor
无法解析
Qualifier
依赖项。需要一点修复。不过,您救了我的命,所以节省了很多。