私は(本番環境で)いくつかのコードを持っています:
- 1 つのスレッドで、db からのデータでキャッシュを準備します
- 別のスレッドで、キャッシュからデータを取得し、そのプロパティの反復処理を開始します。
これはLazyInitializationException
.
問題を解決する方法はわかっていますが、これについてテストしたいと思います。ただし、テストの正しい部分で例外を再作成する方法がわかりません。
DB にいくつかのテスト データを準備する必要があるため、テストには@Transactional
. そうしないと、セットアップが失敗し、... あなたはそれを推測しました... LazyInitializationException
.
これが私の現在のテストです:
@Transactional
public class UpdateCachedMarketPricingActionTest extends AbstractIntegrationTest {
@Autowired
private UpdateCachedMarketPricingAction action;
@Autowired
private PopulateMarketCachesTask populateMarketCachesTask;
@Test @SneakyThrows
public void updatesCachedValues()
{
// Populate the cache from a different thread, as this is how it happens in real life
Thread updater = new Thread(new Runnable() {
@Override
public void run() {
populateMarketCachesTask.populateCaches();
}
});
updater.start();
updater.join();
updateMessage = {...} //ommitted
action.processInstrumentUpdate(updateMessage);
}
そのため、別のスレッドでキャッシュをプライミングして、現在の@Transaction
スコープの外に取得しようとしています。さらに、キャッシュ プライマー内でも呼び出しentityManager.detatch(entity)
て、キャッシュ内に存在するエンティティがコレクションを遅延ロードできないようにします。
ただし、テストはパスします...例外はスローされません。
次にエンティティのコレクションを反復しようとすると、エンティティがスローされる状態に強制するにはどうすればよいLazyInitializationException
ですか?