gpt4 book ai didi

java - 如何使用不同的 spring 上下文为 junit 集成测试创建同一对象的多个实例?

转载 作者:行者123 更新时间:2023-11-30 10:59:18 44 4
gpt4 key购买 nike

我想在集成测试中使用 spring 注释来加载具有不同 applicationContext 的同一对象的不同实例(但使用相同的配置 xml)。下面是一个简单的例子来表示我的问题:

我的 junit 测试是这样的:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:CarContext.xml")
public class CarRaceTest
{
@Autowired
Car car1;

@Autowired
Car car2;

@Test
public void test()
{
car1.displayParts();
car2.displayParts();
}

}

我的车类:

@Component
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE)
public class Car
{
@Autowired
private ElectricalSystem electricalSystem;

@Autowired
private Alternator alternator;

public void displayParts()
{
System.out.println("Parts for car: " + this.toString());
System.out.println(electricalSystem.toString());
System.out.println(alternator.toString());
}

public void raceQuarterMile()
{
}
}

电气系统类:

@Component
public class ElectricalSystem
{
@Autowired
private Alternator alternator;
}

交流发电机类:

@Component
public class Alternator
{
}

CarContext.xml 的内容

    <context:component-scan base-package="springTest"/>

正如您从单辆汽车的示例中看到的那样,交流发电机可能会被多个其他组件/系统引用 - 所有这些都需要引用一个单例实例。然而,为了让两辆车相互竞争的集成测试,我需要每辆车都有自己的应用程序上下文,所以我在每辆车上都有不同的交流发电机。

这是我从上面的代码得到的输出:

Parts for car: springTest.Car@3ea20bc2
springTest.ElectricalSystem@b20dae
springTest.Alternator@29a01add
Parts for car: springTest.Car@4e43b884
springTest.ElectricalSystem@b20dae
springTest.Alternator@29a01add

注意我的两辆车如何拥有完全相同的电气系统和交流发电机 - 这不是我想要的。

将 context.getBean 与两个不同的应用程序上下文一起使用,我已经能够使其在以下 Junit 中按预期工作:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:CarContext.xml")
public class CarRaceTest
{

private String contextFile = "classpath:CarContext.xml";

private ApplicationContext appContext1;
private ApplicationContext appContext2;

Car car1;
Car car2;

public CarRaceTest()
{
this.appContext1 = new FileSystemXmlApplicationContext(this.contextFile);
this.appContext2 = new FileSystemXmlApplicationContext(this.contextFile);
}

@Test
public void test()
{
car1 = appContext1.getBean(Car.class);
car2 = appContext2.getBean(Car.class);

car1.displayParts();
car2.displayParts();
}
}

输出如下:

Parts for car: springTest.Car@247de4f1
springTest.ElectricalSystem@45419cee
springTest.Alternator@56a5f0c7
Parts for car: springTest.Car@2862c542
springTest.ElectricalSystem@6c8484c4
springTest.Alternator@70289784

如何在不调用 .getbean() 的情况下使用注释实现这些相同的结果?

最佳答案

您是对的——Spring 无法将您的实例级引用替换为具有字段访问器的新引用;它由 @Autowired 注释设置一次,然后所有内容都只引用该字段的单例。我相信你的问题可以使用 Spring 的 lookup-method 属性来解决,这里用例子解释:Java code geeks

关于java - 如何使用不同的 spring 上下文为 junit 集成测试创建同一对象的多个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928036/

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