Я использую Netty 4.0 для создания распределенного алгоритма сохранения конфиденциальности для моей магистерской диссертации. Я делаю TDD, и большую часть времени это работает очень хорошо из-за модульного API Netty. Одна проблема, которую я застрял на прошлой неделе, - это я не знаю, как тестировать код, который зависит от ChannelFutureListener
. Так что скажем, что у меня есть следующий код в моей заявке:Netty, как насмехаться с ChannelFuture/ChannelPromise?
public ChannelFuture close() {
if(channel == null)
throw new IllegalStateException("Channel is null.");
ChannelFuture f = channel.close();
f.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture chf) throws Exception {
channel = null;
}
});
return f;
}
Теперь я пытаюсь протестировать этот конкретный метод с помощью модульных тестов. Для того, чтобы работать, мне нужен способ изручить ChannelFuture
(ChannelPromise) для управления вызовом метода слушателя operationComplete
. Я попробовал это с разными подходами. Вот один пример тест:
@Test
public void testConnectAfterClose() {
Channel chMock = mock(Channel.class);
ChannelPromise promise = new DefaultChannelPromise(chMock);
when(chMock.close()).thenReturn(promise);
node.connect(address);
node.close();
promise.setSuccess();
node.connect(address);
}
Результаты Этот тест в NullPointerException
на DefaultPromise.notifyListeners()
. Поэтому мой вопрос: как я могу проверить код, который зависит от ChannelFutureListener
?
Вниз голосов очень полезно, не оставляя комментарии, спасибо. – kunerd
Я не знаком с Netty, поэтому я понятия не имею, откуда он берется, но 'DefaultPromise.notifyListeners()' выглядит как вызов статического метода, который, возможно, также нужно будет обрезать. Если вы используете простой ol 'Mockito, вы не сможете издеваться над статическими, частными и т. Д. Методами. однако вы можете сделать это с помощью PowerMockito. – Morfic