在Java中模拟链式调用的最佳解决方案



我有以下代码:

handler = NodeHandler.getINodeHandler(localZone).getITspPlatformHandler().getITspProcessorManagementHandler();

我是这样模拟的:

mockStatic(NodeHandler.class);
INodeHandler iNodeHandler = mock(INodeHandler.class,Mockito.RETURNS_DEEP_STUBS);
when(NodeHandler.getINodeHandler(localZone)).thenReturn(iNodeHandler);
ITspProcessorManagementHandler iTspProcessorManagementHandler =mock(ITspProcessorManagementHandler.class,Mockito.RETURNS_DEEP_STUBS);
when(iNodeHandler.getITspPlatformHandler().getITspProcessorManagementHandler()).thenReturn(iTspProcessorManagementHandler);

在几行代码之后出现了另一个链式方法调用:

ITspTrafficProcessor processor = NodeHandler.getINodeHandler(localZone, localUI).getITspPlatformHandler().getITspProcessorManagementHandler()
                .getITspProcessorHandler(procs[i]).getITspTrafficProcessorHandler(0).getAttributes();

我是这样模拟的:

when(NodeHandler.getINodeHandler(localZone,UI.CORBA)).thenReturn(iNodeHandler);
when(iNodeHandler.getITspPlatformHandler().getITspProcessorManagementHandler()(+1+).getITspProcessorHandler(anyString())
            .getITspTrafficProcessorHandler(anyInt()).getAttributes()).thenReturn(null);

所以我的问题是,我找不到一个更好的解决方案比这,因为问题是,如果我告诉mockito返回null处理程序而不是iTspProcessorManagementHandler那么我得到一个空指针异常在(+1+),但如果我做以下更改我的代码:

INodeHandler iNodeHandler = mock(INodeHandler.class,Mockito.RETURNS_MOCKS);

然后mockito模拟出每个方法调用,我的when-thenReturn语句不返回我想要的东西,例如null。有什么更好的解决方案吗????

像这样混乱的嘲弄表明您可以改进抽象。我会考虑将特定的逻辑封装在一个helper接口/类中,或者将"trainwreck"返回的预期类型注入到方法/类中。

相关内容

  • 没有找到相关文章

最新更新