如何为具有自动装配依赖项的 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。
假设我有一个名为 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。