【发布时间】:2015-10-28 12:36:03
【问题描述】:
假设我有一个名为 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 来实现这一点。但这不是我想要的解决方案。
我的要求是创建 MainClass 的模拟 bean,而不创建 AutowiredClass 的实际 bean。请帮助我如何实现这一目标。
【问题讨论】:
-
如果你只想创建一个 MainClass 的模拟,你需要整个 Spring 的东西做什么?无论如何,模拟不会包含任何其他内容...
-
我只是举了一个例子。我有一个用例,我要测试的类有多个 @Autowired 字段。我希望其中一些来自春天,而另一些则被嘲笑。
-
但是在那种情况下,主类本身不能是mock,这里似乎是这样。您可以将模拟放入非模拟中,但反过来不会经常发生并且会更困难一些,可能需要一个 Answer 对象来重定向一些对模拟的调用和一些对真实对象的调用。跨度>
-
@FlorianSchaetz,是的。在我的用例中 MainClass 不是一个模拟。 Mainclass 中的一些依赖项需要被模拟。我举了这个例子来简化问题。如果这个问题得到解答,我的用例也将实现。
-
在这种情况下,让您的 MainClass 使用构造函数或 setter 注入,然后 @Autowired 您需要自动装配到测试用例中的对象,创建模拟并使用所有这些对象手动构造 MainClass 的实例。
标签: java spring unit-testing junit mocking