単体テストでのリクエスト スコープ管理に関して多くの質問がありましたが、主な回答は、Spring Framework のタスクであり、適切に動作するように注意する必要があるため、スコープ管理をテストしないことです。したがって、たとえば、XML 構成ファイルで要求スコープをスレッドまたはプロトタイプ タイプのスコープに置き換えることをお勧めします。
ほとんどのテストで十分です。登録されていない「リクエスト」スコープについての苦情はなく、テストは正常に実行されています。しかし、それだけでは不十分なケースが 1 つあります。
次のケースを検討してください。
@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()
新しく作成されます。
出来ますか?