如何模拟 sling PropertyIterator?

How to mock sling PropertyIterator?

我有以下代码要测试:

  static Set<String> methodToTest(Node crxProductNode, OfflineNodeAction nodeAction, Set<String> allowedAttributes) throws RepositoryException {
        Set<String> changedPropertiesKeys = new HashSet<String>();
        final PropertyIterator crxProductNodeProperties = crxProductNode.getProperties();
        while (crxProductNodeProperties.hasNext()) {
            final String crxNodePropertyName = crxProductNodeProperties.nextProperty().getName();
            if(nodeAction.getProperties(crxNodePropertyName)==null && allowedAttributes.contains(crxNodePropertyName)){
                changedPropertiesKeys.add(crxNodePropertyName);
            }
        }
        return changedPropertiesKeys;
    }

请告诉我如何测试以下代码。

我对迭代器模拟有疑问。我不明白如何模拟它。

因为PropertyIterator是从crxProductNode接收到的,它是传递给方法的参数,所以它是所谓的"test collaborator"的书本定义。

我们应该模拟测试协作者,在你的情况下模拟 crxProductNode 到 return 另一个 PropertyIterator 类型的模拟并传递它方法。

具体代码取决于你的mocking框架,但应该是类似下面的伪代码:

@Test
public void testMyPropertyIterator() {
    Sut sut = new SUT(); // System Under Test, the class with your method

    Node nodeMock                   = mock(Node.class);
    PropertyIterator mockProperties = mock(PropertyIterator.class);

    when(nodeMock.getProperties()).thenReturn(mockProperties);

    sut.methodToTest(nodeMock, ...);

   // verification or assertions
}

因为这个存在class

org.apache.sling.commons.testing.jcr.MockNode

MockNodeIterator