【发布时间】:2012-04-17 15:23:10
【问题描述】:
在单元测试中有很多关于请求范围管理的问题,主要答案是不要测试范围管理,因为它是 Spring Framework 任务,应该注意它是否正常工作。因此,建议例如将请求范围替换为 XML 配置文件中的线程或原型类型范围。
对于大多数测试来说已经足够了,没有关于未注册“请求”范围的抱怨,并且测试运行良好。但我确实有一种情况是不够的。
考虑以下情况:
@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 替换请求范围,那么在两个测试中我将收到MyService 和MyComponent 的相同实例,例如test2() 可能会收到来自MyComponent 的错误结果内部可能包含一些来自之前test1()的内部“垃圾”
变体 B
如果我用原型范围替换请求范围 - 我会遇到我的测试方法接收到 MyComponent 的不同实例的情况,就像 MyService 那样 - 所以我无法对它们执行任何断言。
所以我需要的是一种与测试方法相关的请求范围,其中所有请求范围的 bean 仅在 test1() 方法期间保留,然后被销毁,因此在下一个 test2() 中它们将被重新创建。
有可能吗?
【问题讨论】:
标签: java spring unit-testing junit scope