Ich habe ein Stück Legacy-Code geerbt und ich kämpfe jetzt mit einem Test, der manchmal fehlschlägt.Verwenden eines verspotteten Objekts bilden mehrere Threads
Der Testaufbau lautet:
ADao aDao = EasyMock.createNiceMock(ADao.class);
aDao.aCall(EasyMock.eq(anObject), EasyMock.eq(true));
EasyMock.expectLastCall().andReturn(TestHelper.getAList(anObject));
Dann wird die aDao
an einen Controller für einige Arbeiter-Threads übergeben wird, beginnt der Regler N Threads und der Test steht in Verbindung mit einer der Threads Ereigniswarteschlangen verwenden.
Das Problem, das ich habe, ist, dass, wenn die Worker-Threads versuchen, das verspottete Dao zu verwenden, sie die Liste nicht an andReturn
übergeben, aber ihre Kopie, und die Kopie ist manchmal unvollständig. TestHelper.getAList
gibt eine ArrayList
von 139 Elementen zurück, aber der Mock gibt manchmal eine perfekte Kopie zurück, manchmal eine Kopie mit 14 oder 16 Elementen. Ich glaube, das Kopieren wird immer noch in einem anderen Thread ausgeführt, da das Iterieren über die zurückgegebene Liste ConcurrentModificationException
auslöst.
Gibt es eine Möglichkeit, EasyMock entweder das Objekt zu verwenden, mit dem es eingerichtet wurde, anstatt es zu kopieren oder zu kopieren, bevor das Objekt an einen Aufrufer übergeben wird?
(EasyMock mit makeThreadSafe(..., false)
Kennzeichnung das Problem nicht lösen.)