### Question:
ExternalResourceStepAnalyzer extends StepAnalyzer<T> { @Override protected void linkChangeNodes( IMetaverseNode inputNode, IMetaverseNode outputNode ) { boolean nodeTypesMatch = inputNode.getType().equals( outputNode.getType() ); if ( !nodeTypesMatch && ( isInput() || isOutput() ) ) { getMetaverseBuilder().addLink( inputNode, DictionaryConst.LINK_POPULATES, outputNode ); } else { getMetaverseBuilder().addLink( inputNode, getInputToOutputLinkLabel(), outputNode ); } }  boolean hasOutputResource( T meta ); IStepExternalResourceConsumer getExternalResourceConsumer(); void setExternalResourceConsumer( IStepExternalResourceConsumer externalResourceConsumer ); Set<String> getOutputResourceFields( T meta ); abstract IMetaverseNode createResourceNode( IExternalResourceInfo resource ); IMetaverseNode createResourceNode( T meta, IExternalResourceInfo resource ); abstract String getResourceInputNodeType(); abstract String getResourceOutputNodeType(); abstract boolean isOutput(); abstract boolean isInput(); @Override boolean copyState( final IClonableStepAnalyzer newAnalyzer ); static final String RESOURCE; }### Answer:
@Test public void testLinkChangeNodes() throws Exception { IMetaverseNode inputNode = mock( IMetaverseNode.class ); IMetaverseNode outputNode = mock( IMetaverseNode.class ); when( inputNode.getType() ).thenReturn( "A" ); when( outputNode.getType() ).thenReturn( "A" ); doReturn( true ).when( analyzer ).isInput(); doReturn( false ).when( analyzer ).isOutput(); analyzer.linkChangeNodes( inputNode, outputNode ); verify( builder, never() ).addLink( inputNode, DictionaryConst.LINK_POPULATES, outputNode ); verify( builder ).addLink( inputNode, analyzer.getInputToOutputLinkLabel(), outputNode ); }