Spring Beans - Spring发现两个豆而不是一个豆

时间:2017-11-24 11:11:46

标签: java spring testng autowired

我正在尝试使用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)

我需要两个豆子。一个人被嘲笑,一个人没有被嘲笑。 我怎样才能做到这一点?

编辑:我完全搞砸了这里的命名。匆匆忙忙。我会用正确的名字编辑这个问题。

1 个答案:

答案 0 :(得分:0)

您目前在上下文中有三个类型为/q=Fruit的bean。 在您的测试中,您实际使用MyClass注释来连接名为getMyBeanMyBean的bean。您的测试bean的名称为@Qualifier。所以你实际上添加了第三个而不是覆盖getMyClass bean。

要实现所需的行为,请按以下方式定义测试bean:

getMyBean

现在它用模拟的bean覆盖了你的“高效”bean @Bean(name="getMyBean") public MyClass mockedMyClass() { return context.mock(MyClass.class); } 的bean定义。

编辑:我刚看到你有五个 bean。我错过了getMyBean和名为bean1的xml配置bean。老实说,你应该给你的类,对象和变量更好的名字。即使你只问一个问题。很难不被混淆。

所以你有五个豆子。并且没有定义了要在生产和测试代码中注入的名称的bean。我不知道如何使用此配置加载spring上下文。您是否将TestNG配置为设置弹簧上下文?通常,您会扩展QuarantineHelper并使用AbstractTestNGSpringContextTests

提供上下文配置