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

时间:2014-07-31 11:24:22

标签: java mockito

我有以下代码:

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 +)处得到一个nullpointer异常,但如果我对我的代码进行以下更改:

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

比mockito模拟每个方法调用,而我的when-thenReturn语句不返回我想要的,例如null。所以任何建议都要做更好的解决方案????

1 个答案:

答案 0 :(得分:3)

像这样凌乱的嘲笑表明你可以改善抽象。我考虑将该特定逻辑封装在辅助接口/类中,或者注入" trainwreck"返回的预期类型。方法/类。