### Question:
NodeChange implements

        BeforeDeleteNodePolicy, OnAddAspectPolicy, OnCreateNodePolicy, OnMoveNodePolicy,
        OnRemoveAspectPolicy, OnUpdatePropertiesPolicy,

        OnContentReadPolicy, OnContentUpdatePolicy,

        OnCreateVersionPolicy,

        OnCopyCompletePolicy,
        
        OnCheckOut, OnCheckIn, OnCancelCheckOut { @Override public void onMoveNode(ChildAssociationRef fromChildAssocRef, ChildAssociationRef toChildAssocRef) { setMoveFrom(fromChildAssocRef); setMoveTo(toChildAssocRef); appendSubAction(new NodeChange(nodeInfoFactory, namespaceService, toChildAssocRef.getChildRef()). setAction(MOVE_NODE). setMoveFrom(fromChildAssocRef). setMoveTo(toChildAssocRef)); } NodeChange(NodeInfoFactory nodeInfoFactory, NamespaceService namespaceService, NodeRef nodeRef); String getDerivedAction(); boolean isTemporaryNode(); NodeChange setAuditSubActions(boolean auditSubActions); @Override void beforeDeleteNode(NodeRef nodeRef); @Override void onCreateNode(ChildAssociationRef childAssocRef); @Override void onMoveNode(ChildAssociationRef fromChildAssocRef, ChildAssociationRef toChildAssocRef); @Override void onUpdateProperties(NodeRef nodeRef,
            Map<QName, Serializable> fromProperties, Map<QName, Serializable> toProperties); @Override void onRemoveAspect(NodeRef nodeRef, QName aspect); @Override void onAddAspect(NodeRef nodeRef, QName aspect); @Override void onContentUpdate(NodeRef nodeRef, boolean newContent); @Override void onContentRead(NodeRef nodeRef); @Override void onCreateVersion(QName classRef, NodeRef nodeRef,
            Map<String, Serializable> versionProperties, PolicyScope nodeDetails); void onCopyComplete(QName classRef, NodeRef sourceNodeRef, NodeRef targetNodeRef,
            boolean copyToNewNode, Map<NodeRef, NodeRef> copyMap); void onCheckOut(NodeRef workingCopy); void onCheckIn(NodeRef nodeRef); void onCancelCheckOut(NodeRef nodeRef); Map<String, Serializable> getAuditData(boolean subAction); static final String SUB_ACTION; static Collection<String> SUMMARY_KEYS; static final String SUB_ACTION_PREFIX; }### Answer:
@Test public final void testOnMoveNode() { ChildAssociationRef fromChildAssocRef = mock(ChildAssociationRef.class); when(fromChildAssocRef.getChildRef()).thenReturn(content1); when(fromChildAssocRef.getParentRef()).thenReturn(folder2); when(fromChildAssocRef.getQName()).thenReturn(QName.createQName("URI", "content1")); ChildAssociationRef toChildAssocRef = mock(ChildAssociationRef.class); when(toChildAssocRef.getChildRef()).thenReturn(content1); when(toChildAssocRef.getParentRef()).thenReturn(folder1); when(toChildAssocRef.getQName()).thenReturn(QName.createQName("URI", "content1")); nodeChange.onMoveNode(fromChildAssocRef, toChildAssocRef); Map<String, Serializable> auditMap = nodeChange.getAuditData(false); assertStandardData(auditMap, "MOVE", "moveNode"); assertEquals("/cm:homeFolder/cm:folder2/cm:content1", auditMap.get("move/from/path")); assertEquals(content1, auditMap.get("move/from/node")); assertEquals("cm:content", auditMap.get("move/from/type")); }