Я унаследовал часть устаревшего кода, и теперь я борюсь с тестом, который иногда случается.Использование образованного объекта из нескольких потоков
установкиТест выглядит следующим образом:
ADao aDao = EasyMock.createNiceMock(ADao.class);
aDao.aCall(EasyMock.eq(anObject), EasyMock.eq(true));
EasyMock.expectLastCall().andReturn(TestHelper.getAList(anObject));
Затем aDao
передается в контроллер для некоторых рабочих потоков, контроллер начинает N потоков и тест взаимодействует с одним из потоков с использованием очередей событий.
Проблема, с которой я сталкиваюсь, заключается в том, что когда рабочие потоки пытаются использовать насмешливый Дао, они не возвращают список, переданный andReturn
, но его копия, и копия иногда является неполной. TestHelper.getAList
возвращает ArrayList
из 139 предметов, но иногда изредка возвращает идеальную копию, иногда копию с 14 или 16 элементами. Я считаю, что копирование все еще выполняется в другом потоке, потому что итерация по возвращенному списку вызывает ConcurrentModificationException
.
Есть ли способ сделать EasyMock или использовать объект, который был настроен вместо копирования или b/закончить копирование, прежде чем объект будет передан вызывающему абоненту?
(маркировка EasyMock с makeThreadSafe(..., false)
не решает проблему.)