sto cercando di scrivere uno unit test per questo:Come posso risolvere correttamente una risorsa chiudibile automaticamente?
try (final DatagramChannel channel = helper.createChannel()) {
...
}
Nella mia prova, ho deridere il helper (utilizzando Mockito), e dire helper.createChannel() per restituire un canale deriso.
Questo test ha esito negativo con
java.lang.NullPointerException
at java.nio.channels.spi.AbstractInterruptibleChannel.close(AbstractInterruptibleChannel.java:111)
ho capito che la struttura try-with-risorse in Java chiama il metodo close() nella DatagramChannel all'uscita del blocco try, ma non dovrebbe la close() viene chiamato il metodo nel DatagramChannel deriso?
Il debugger mi dice che il closeLock in AbstractInterruptibleChannel è nullo.
Devo creare una sottoclasse di DatagramChannel, sovrascrivere il metodo close() e quindi prendere in giro la mia sottoclasse? Oppure, sto facendo qualcosa di sbagliato in un modo più profondo (l'aiutante deride restituisce una finta)?
saluti, Fredrik Israelsson
codice di prova, su richiesta:
@Mock
private InetAddress peerAddress;
@Mock
private UDPChannelHelper helper;
@Mock
private DatagramChannel channel;
private UDPTransportImpl transport;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(helper.createChannel()).thenReturn(channel);
transport = new UDPTransportImpl(peerAddress, 0, helper);
}
@Test
public void testNormalSubmit() throws Exception {
transport.submit("Hello");
}
Come potete vedere, non mi specificare qualsiasi comportamento per channel.close(). Sono convinto che non dovrei farlo, perché close() restituisce il nulla.
Puoi mostrare il tuo codice dove stai prendendo in giro questi? Inoltre hai eseguito il debug e confermato che a) l'helper è in realtà un simulatore, b) helper.createChannel() restituisce anche un oggetto deriso? – cowls
Aggiunto il codice di test e sì, nel debugger, sia helper che channel sono del tipo BlaBlaBla $$ EnhancerByMockitoWithCGLIB. –
Questa pagina: http://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html#doNothing%28%29 afferma esplicitamente "che i metodi di annullamento su mock non eseguono nulla di default!". Quindi possiamo solo supporre che il blocco finally non sia in esecuzione su una simulazione. Il tuo codice mi sembra buono, quindi non sono sicuro del motivo per cui ... non dovresti comunque aver bisogno di sottoclassi tu stesso. – cowls