2014-10-29 3 views
0

Я использую 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?

+0

Вниз голосов очень полезно, не оставляя комментарии, спасибо. – kunerd

+0

Я не знаком с Netty, поэтому я понятия не имею, откуда он берется, но 'DefaultPromise.notifyListeners()' выглядит как вызов статического метода, который, возможно, также нужно будет обрезать. Если вы используете простой ol 'Mockito, вы не сможете издеваться над статическими, частными и т. Д. Методами. однако вы можете сделать это с помощью PowerMockito. – Morfic

ответ

1

Я нашел способ решить мою проблему. Он работает, если макет канала (chMock) заменяется реальным каналом, например EmbeddedChannel. После этого я использую spy для канала вместо макета.

Вот мое текущее решение:

@Test 
public void testConnectAfterClose() { 
    Channel helper = new EmbeddedChannel(mock(ChannelHandler.class)); 
    chMock = spy(helper); 

    when(chMock.close()).thenReturn(promise); 
    node.connect(address); 
    node.close(); 
    promise.setSuccess(); 
    node.connect(address); 
} 

@Morfic: Спасибо за ваш комментарий. Это был хороший намек на мое текущее решение.

+0

Без проблем, рад, что смогу помочь – Morfic

+0

Работал и для меня –

Смежные вопросы