我正在尝试使用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();
}
&#39;测试&#39;豆喜欢:
@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)
我需要两个豆子。一个人被嘲笑,一个人没有被嘲笑。 我怎样才能做到这一点?
编辑:我完全搞砸了这里的命名。匆匆忙忙。我会用正确的名字编辑这个问题。
答案 0 :(得分:0)
您目前在上下文中有三个类型为/q=Fruit
的bean。
在您的测试中,您实际使用MyClass
注释来连接名为getMyBean
和MyBean
的bean。您的测试bean的名称为@Qualifier
。所以你实际上添加了第三个而不是覆盖getMyClass
bean。
要实现所需的行为,请按以下方式定义测试bean:
getMyBean
现在它用模拟的bean覆盖了你的“高效”bean @Bean(name="getMyBean")
public MyClass mockedMyClass() {
return context.mock(MyClass.class);
}
的bean定义。
getMyBean
和名为bean1
的xml配置bean。老实说,你应该给你的类,对象和变量更好的名字。即使你只问一个问题。很难不被混淆。
所以你有五个豆子。并且没有定义了要在生产和测试代码中注入的名称的bean。我不知道如何使用此配置加载spring上下文。您是否将TestNG配置为设置弹簧上下文?通常,您会扩展QuarantineHelper
并使用AbstractTestNGSpringContextTests