gpt4 book ai didi

java - Spring Beans - Spring 找到两个 bean 而不是一个

转载 作者:行者123 更新时间:2023-12-05 07:38:52 26 4
gpt4 key购买 nike

我想在这里用 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)

我需要两个 bean 。一个被“ mock ”,一个没有被 mock 。我怎样才能使它工作?

编辑: 我完全搞砸了这里的命名。来得太仓促了。我将使用专有名称编辑此问题。

最佳答案

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

要实现所需的行为,请像这样定义您的测试 bean:

@Bean(name="getMyBean")
public MyClass mockedMyClass() {
return context.mock(MyClass.class);
}

现在它用模拟的 bean getMyBean 覆盖了“生产性”bean 的 bean 定义。

编辑:我刚刚看到您有五个 个 bean 。我错过了 bean1 和名为 QuarantineHelper 的 xml 配置 bean。老实说,你应该给你的类、对象和变量起更好的名字。即使你只是问一个问题。真的很难不感到困惑。

所以你有五个 bean 。并且没有定义名称的 bean 要注入(inject)生产和测试代码。我不知道如何使用此配置加载您的 spring 上下文。您是否配置了 TestNG 来设置 spring 上下文?通常,您扩展 AbstractTestNGSpringContextTests 并使用 @ContextConfiguration

提供上下文配置

关于java - Spring Beans - Spring 找到两个 bean 而不是一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47472056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com