単体テストでのリクエスト スコープ管理に関して多くの質問がありましたが、主な回答は、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()から悪い結果を受け取る可能性があります。MyComponenttest1()
バリアント B
MyComponentリクエスト スコープをプロトタイプ スコープに置き換えると、テスト メソッドが異なるインスタンスを受け取るケースが発生するため、MyServiceそれらに対してアサーションを実行できません。
したがって、私が必要とするのは、テスト メソッドに関連するリクエスト スコープのようなものです。リクエスト スコープのすべての Bean は、test1()メソッドの実行中だけ残り、その後破棄されるため、次にtest2()新しく作成されます。
出来ますか?