Próbuję napisać test jednostkowy do tego:Jak mogę sfałszować zasoby automatycznie zamykane?
try (final DatagramChannel channel = helper.createChannel()) {
...
}
W moim teście, ja drwić pomocnika (używając Mockito) i powiedzieć helper.createChannel(), aby powrócić do szydzili kanał.
Ten test nie powiedzie się z
java.lang.NullPointerException
at java.nio.channels.spi.AbstractInterruptibleChannel.close(AbstractInterruptibleChannel.java:111)
Rozumiem, że try-with-zasobów obiekt w Javie wywołuje metodę close() w DatagramChannel po wyjściu z bloku try, ale nie powinny ścisłe() wzywana jest metoda w szyderczym DatagramChannel?
Debugger mówi mi, że closeLock w AbstractInterruptibleChannel ma wartość null.
Czy należy podklasować DatagramChannel, zastąpić metodę close() w nim, a następnie kpić z mojej podklasy? Czy robię coś złego w bardziej głęboki sposób (pomocna sztuczka zwraca sztuczkę)?
Pozdrawiam, Fredrik Israelsson
kod testowy, na wniosek:
@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");
}
Jak widać, nie określił żadnych zachowanie dla channel.close(). Jestem przekonany, że nie powinienem tego robić, ponieważ close() zwraca pustkę.
Czy możesz pokazać swój kod tam, gdzie kpisz z nich? Również debugowałeś i potwierdziłeś, że a) pomocnik jest w rzeczywistości symulacją, b) helper.createChannel() zwraca również wyszydzany obiekt? – cowls
Dodano kod testowy, i tak, w debugerze, zarówno helper, jak i kanał są typu BlaBlaBla $$ EnhancerByMockitoWithCGLIB. –
Ta strona: http://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html#doNothing%28%29 jednoznacznie stwierdza, że "nieważne metody na próbach domyślnie nie robią nic!". Możemy więc tylko założyć, że blok finally nie wykonuje się na sztuczce. Twój kod wygląda dla mnie dobrze, więc nie jestem pewien, dlaczego tak jest. Z pewnością nie powinieneś jednak samodzielnie go podklasować. – cowls