我有一些代码(在生产中):
- 在一个线程中,使用数据库中的数据初始化缓存
- 在另一个线程中,从缓存中获取数据,并开始迭代它的属性。
这抛出了一个LazyInitializationException
.
虽然我知道如何解决这个问题,但我想对此进行测试。但是我不知道如何在测试的正确部分重新创建异常。
我必须用一些测试数据来初始化数据库,因此我的测试用@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
?