JUnit テストで、Spring DAO の hibernate テンプレートを変更したいと考えています。このDAOは
- @Transactional で注釈が付けられているため、実行時にラップされ、
- Mockitos の spy() メソッドによってスパイされました。そのため、DAO はそのスパイによって 2 回ラップされます。
したがって、DAO には 2 つのラッピング オブジェクトがあります。1 つは @Transactional から、もう 1 つはスパイからです。これらのラッパーのどれが最初に作成されるかがわからないため、リフレクションを介して DAO で休止状態のテンプレートを設定できません。
二重ラップされた DAO でテンプレートを設定するにはどうすればよいですか?
[編集]
いくつかのソース:
/**
* This class gets wrapped by a proxy object because of @Transactional.
*/
@Transactional
public class MyDao implements SomeDaoInterface { ... }
テストクラスで:
public class MyTestClass {
@Autowired
private MyDao myDao;
@Test
public void myTestMethod() throws Exception {
final MyDao daoSpy = spy(myDao); // Dao gets wrapped with second wrapper
final Field field = MyDao.class.getDeclaredField("template");
field.setAccessible(true);
field.set(daoSpy, mySpecialMockedTemplate); // ERROR: want to inject the template but
// dont know in which wrapper
}
}