【问题标题】:best solution for mocking chained calls in Java在 Java 中模拟链式调用的最佳解决方案
【发布时间】:2014-09-23 07:51:33
【问题描述】:

我有以下代码:

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。那么有什么建议可以做一个更好的解决方案吗????

【问题讨论】:

    标签: java mockito


    【解决方案1】:

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

    【讨论】:

    • 我忘了写我在处理遗留代码。(或者你认为是测试代码?)
    • 使用遗留代码可能会很痛苦。但遗留代码也可以重构。像这样的案例是逐步提高代码质量的机会。无论如何,如果你真的需要像这样模拟 trainwrecks,我相信你需要链中的每个方法调用来返回一个你可以设置的模拟。因此,每个调用都需要 whenthenReturn
    猜你喜欢
    • 2011-04-12
    • 2012-04-16
    • 2014-11-27
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多