2016-06-03 19 views
0

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.)

Antwort

0

OK, löste ich das Problem mit

EasyMock.expectLastCall().andAnswer(new IAnswer<List>() { ... });