繁体   English   中英

春季豆-春季发现两个豆而不是一个

[英]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批注连接名为getMyBeanMyBean的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM