gpt4 book ai didi

java - Netty,如何模拟 ChannelFuture/ChannelPromise?

转载 作者:行者123 更新时间:2023-12-01 12:21:37 24 4
gpt4 key购买 nike

我正在使用Netty 4.0为我的硕士论文创建分布式隐私保护算法。我使用 TDD,大多数时候,由于 Netty 的模块化 API,它的效果非常好。上周我遇到的一个问题是我不知道如何测试依赖于 ChannelFutureListener 的代码。假设我的应用程序中有以下代码:

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);
}

此测试会在 DefaultPromise.notifyListeners() 处产生 NullPointerException。因此我的问题是,如何测试依赖于 ChannelFutureListener 的代码?

最佳答案

我找到了解决问题的方法。如果将 channel 的模拟 (chMock) 替换为真实 channel (例如 EmbeddedChannel),则该方法有效。之后,我对 channel 使用 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:谢谢您的评论。这对我当前的解决方案来说是一个很好的提示。

关于java - Netty,如何模拟 ChannelFuture/ChannelPromise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26626122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com