jUnit テストと Bean プロキシで非常に奇妙な問題が発生しています。テストの一環として、アプリケーション コンテキストに Bean を手動で追加しAutowireCapableBeanFactory.autowire()
、自動配線更新を強制するために使用して Bean の再配線を強制しています。
jUnit テストにブレークポイントを配置し、オートワイヤ更新中の Bean を検査すると、フィールドが適切に更新され、プログラムでコンテキストに追加した新しい Bean が含まれていることがわかります。
ただし、実行が実際の Bean に移動し、テストしているメソッドにブレークポイントを配置すると、コンテキストに追加した Bean が表示されません。
私の Bean-under-test メソッドには の注釈が付けられてい@Transactional
ます。注釈を削除する@Transactional
と、autowire フィールドが適切に更新されます。
@Transaction を jUnit テスト メソッドに追加しようとしましたが、影響はありませんでした。
Junit (BeanDefinitionRegistryPostProcessor を実装):
@Test
@Rollback
@Transactional
public void testExecuteSinglePatch() throws Exception {
GenericBeanDefinition definition = new GenericBeanDefinition();
definition.setBeanClass(Patch1.class);
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
definition.setLazyInit(false);
registry.registerBeanDefinition("PATCH_1", definition);
applicationContext.getBeansOfType(Patch.class);
// reinit the patchEngine
autowireBeanFactory.autowireBean(patchEngine);
patchEngine.execute();
assertEquals(1, patchRepository.findByName( new Patch1().getName()).size() );
}
テスト対象の Bean (PatchEngine):
@Inject private Map<String, Patch> availablePatches;
@Transactional
public void execute() throws Exception{
// loop over all the pending patches, and apply them. Keep looping over while patches exist and at least one patch is applied per iteration
boolean appliedPatch = true;
while( !availablePatches.isEmpty() && appliedPatch ){
// no applied patches this iteration yet
appliedPatch = false;
// do some logic here
}
}
デバッグ コンテキストを jUnit テストに設定して調べるpatchEngine
と、 の Bean ID がpatchEngine.availablePatches
、デバッグ コンテキストを patchEngine.execute メソッドに設定したときに見つかった Bean ID とは異なります。
@transactional
ただし、メソッドから注釈を削除するとexecute()
、ID は同じになります。
何が起こっているのかを理解するのを手伝ってくれる人はいますか? @Transactional
依存性注入に影響を与えるのはなぜですか? @Transactional はプロキシにどのように影響し、プロキシが適切に設定されていることを確認する方法は? 注釈により、別のコンテキストが使用されますか? この問題を解決する方法はありますか?
Spring 3.2.4.RELEASE と jUnit 4.11 を使用しています。これは春のバグでしょうか?