在 for 循环中使用模拟对象列表获取 NullPointerException

Getting NullPointerException on using List of mocked Object in a for loop

要模拟的函数是 class NegotiateNode:

protected String getAttributeValueFromNodeOfServiceType(String serviceType, String attributeName) {
    String attributeValue = null;

    for (Node node : this.getListOfNodes()) {
        if (node.getServiceType().equals(serviceType)) {
            attributeValue = node.getAttribute(attributeName);
            break;
        }
    }

    return attributeValue;
}

这是测试:

@Mock private NegotiateNode mockN;
@Mock private Node mockNode;
private List<Node> mockListOfNodes = Arrays.asList(mockNode, mockNode, mockNode);

@Before
public void setup() throws Exception
{
     when(mockN.getListofNodes()).thenReturn(mockListofNodes);  
}

@Test
public void getAttributeValueFromNodeOfServiceType_ServiceTypeExists_ReturnAttribute() {

     when(mockNode.getServiceType()).thenReturn("PMN", "AMC", "SMC");
     when(mockNode.getAttribute(anyString()).thenReturn("mockedValue");

     when(NegotiateNode.getAttributeValueFromNodeOfServiceType(anyString(), anyString())).thenCallRealMethod();

     assertEquals("mockedValue", mockN.getAttributeValueFromNodeOfServiceType("AMC", "dummyAttribute"));

}

我在 运行 这个测试中得到了 NullPointerException。原因是node的for循环里面的值是null。这似乎是因为 List 在 java 中的工作方式。有什么解决方法吗?

您需要将模拟节点添加到设置方法中的列表中。

@Before
public void setup() throws Exception
{
    mockListOfNodes = Arrays.asList(mockNode, mockNode, mockNode);
    when(mockN.getListofNodes()).thenReturn(mockListofNodes);  
}