Nieuw antwoord op oude vraag; Ik heb je vraag gevonden, want ik heb te maken met exact hetzelfde probleem: ik wil een eenheidscontrole schrijven om te verifiëren dat mijn geteste klasse iets heel speciaals doet als de referent van een WeakReference null wordt.
Ik heb eerst een eenvoudige testcase geschreven die de referent op nul zou zetten; om vervolgens System.gc()
aan te roepen; en interessant genoeg: tenminste in mijn eclips was dat "goed genoeg" om mijn weakRefernce.get()
null te retourneren.
Maar wie weet of dat zal werken voor alle toekomstige omgevingen die deze unit-test voor de komende jaren zullen uitvoeren.
Dus na het nadenken over wat meer:
@Test
public void testDeregisterOnNullReferentWithMock() {
@SuppressWarnings("unchecked")
WeakReference
Werkt ook goed.
Betekenis: het generieke antwoord op dit probleem is een fabriek die WeakReference voor objecten voor u maakt. Dus als u uw productiecode wilt testen; je levert er een bespotte fabriek aan; en die fabriek zal op zijn beurt de WeakReference-objecten bespotten; en nu heb je de volledige controle over het gedrag van dat zwakke referentieobject.
En "volledige controle" is veel beter dan aannemen dat de GC misschien doet wat u hoopt dat het doet.