gpt4 book ai didi

java - 单元测试中的请求范围 bean 管理

转载 作者:行者123 更新时间:2023-12-01 05:22:17 28 4
gpt4 key购买 nike

在单元测试中存在很多关于请求作用域管理的问题,主要的答案是不要测试作用域管理,因为它是 Spring 框架的任务,应该注意它是否正常工作。因此,例如,建议将 XML 配置文件中的请求范围替换为线程或原型(prototype)类型范围。

对于大多数测试来说,这已经足够了,没有人提示未注册“请求”范围,并且测试运行良好。但我确实遇到过一种情况,这还不够。

考虑以下情况:

@Component
@Scope("request")
public class MyService {

@Autowired
private MyComponent component;

public void doSomething(String param) {
component.doTheThing(param);
}
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:my-scope-tweaks.xml"})
public class MyServiceTest {

@Autowired
private MyService service;

@Autowired
private MyComponent component;

@Test
public void test1() {
service.doSomething("aaa");

assertEquals("AAA", component.getTheThing());
}

@Test
public void test1() {
service.doSomething("bbb");

assertEquals("BBB", component.getTheThing());
}

}

我想测试 MyService,它是请求范围的。 MyComponent 也是请求范围。

变体A

如果我用 SimpleThreadScope 替换请求范围,那么在这两个测试中我将收到相同的 MyServiceMyComponent 实例,因此例如,test2() 可能会从 MyComponent 收到不良结果,因为它内部可能包含之前 test1() 的一些内部“垃圾”

变体B

如果我用原型(prototype)范围替换请求范围 - 我会得到这样的情况:我的测试方法与 MyService 一样接收 MyComponent 的不同实例 - 所以我无法执行任何操作对他们的断言。

所以我需要的是一种与测试方法相关的请求范围,其中所有请求范围的 bean 都保留在 test1() 方法期间,然后被销毁,所以在下一个 test2() 它们将再次被新创建。

可能吗?

最佳答案

这可能不是您想要的,但是您为什么首先使用 Spring 来管理您的测试类?这对我来说似乎太过分了。对于单元测试,您不需要 DI 容器。只需模拟依赖项并专注于您正在测试的组件或服务的封装功能。

但是,在使用字段注入(inject)时您将无法做到这一点。您需要转换为构造函数或方法注入(inject)。

关于java - 单元测试中的请求范围 bean 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10194107/

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