[英]Spring Beans - Spring finds two beans instead of one
我在这里尝试使用Spring和TestNG。 两者都是很新的东西,只是从这里到那里复制粘贴一些代码,以尝试在现有代码库中创建新功能。
要点大致是这样的:
我有我的源代码。 我在那里需要一个bean,因此在我的Spring XML配置文件中,我做了:
<bean id="bean1" class="com.mypackage.MyClass" />
然后将代码放在MyClass.java中,然后执行以下操作:
@Autowired
@Qualifier("bean1")
private MyClass myBean;
public void myCallingFunction(final MyInput input) {
myBean.myFunction(input.getList().get(0));
}
我的测试代码如下:
@Autowired
@Qualifier("getMyBean")
private MyClass myBean;
@Autowired
@Qualifier("MyBean")
private MyClass myBean2;
@Test(expectedExceptions = ValidationException.class)
public void testExceptionCase() throws ValidationException {
List<String> list = new ArrayList<>();
list.add("SomeString");
MyInput input = new MyInput();
input.setList(list);
context.checking(new Expectations() {
{
oneOf(myBean).myFunction(with(any(String.class)));
will(throwException(new ValidationException()));
}
});
myBean2.myCallingFunction(input);
context.assertIsSatisfied();
}
还有一个“测试” bean,例如:
@Bean
public MyClass getMyClass() {
return context.mock(MyClass.class);
}
现在运行此测试时,我得到以下信息:
not all expectations were satisfied
[testng] expectations:
[testng] expected once, never invoked: myBean.myFunction(ANYTHING); throws <com.mypackage.ValidationException>
[testng] at org.jmock.Mockery.assertIsSatisfied(Mockery.java:196)
[testng] at com.mypackage.test.testExceptionCase(MyFileTest.java:51)
[testng] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[testng] at java.lang.reflect.Method.invoke(Method.java:498)
[testng] at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.run(AbstractTestNGSpringContextTests.java:175)
[testng] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[testng] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[testng] at java.lang.Thread.run(Thread.java:748)
我需要两个豆。 一个“嘲笑”,一个没有嘲笑。 我该如何进行这项工作?
编辑:我完全搞砸了这里的命名。 仓促。 我将使用专有名称编辑此问题。
当前,您的上下文中有三个类型为MyClass
bean。 在测试中,您实际上使用@Qualifier
批注连接名为getMyBean
和MyBean
的bean。 您的测试bean的名称为getMyClass
。 因此,您实际上添加了第三个,而不是覆盖getMyBean
bean。
为了实现所需的行为,请如下定义测试bean:
@Bean(name="getMyBean")
public MyClass mockedMyClass() {
return context.mock(MyClass.class);
}
现在,它用getMyBean
覆盖了“生产” bean getMyBean
的bean定义。
编辑:我刚刚看到你有五个豆。 我错过了bean1
和名为QuarantineHelper
的xml配置bean。 老实说,您应该给类,对象和变量取更好的名称。 即使您只是问一个问题。 很难不感到困惑。
所以你有五个豆。 而且,没有要在生产和测试代码中定义名称的bean。 我不知道如何使用此配置加载spring上下文。 您是否配置了TestNG来设置spring上下文? 通常,您扩展AbstractTestNGSpringContextTests
并使用@ContextConfiguration
提供上下文配置
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.