【问题标题】:ComparisonFailure in EasMockEasMock 中的比较失败
【发布时间】:2014-05-16 18:37:07
【问题描述】:

我有以下方法,我想使用 EasyMock 进行测试。

public String createNode(Session session, String name) throws RepositoryException {
    Node root = session.getRootNode();
    Node testNode = root.getNode( "content" );
    if( !testNode.hasNode(name) ) {
        testNode.addNode( name, "nt:unstructured" );
    }
    return testNode.getPath()+"/"+name;
}

测试方法是:

@Test
public void createNodeTest() throws RepositoryException {   
    final Session SESSION_MOCK = EasyMock.createNiceMock((Session.class));
    final Node ROOT_NODE_MOCK = EasyMock.createNiceMock(Node.class);
    final Node CONTENT_NODE_MOCK = EasyMock.createNiceMock(Node.class);
    final Node CHILD_NODE_MOCK = EasyMock.createNiceMock(Node.class);

    EasyMock.expect(SESSION_MOCK.getRootNode()).andReturn(ROOT_NODE_MOCK);       
    EasyMock.expect(ROOT_NODE_MOCK.getNode("content")).andReturn(CONTENT_NODE_MOCK);        
    EasyMock.expect(CONTENT_NODE_MOCK.hasNode("viv")).andReturn(false);        
    EasyMock.expect(CONTENT_NODE_MOCK.addNode("viv","nt:unstructured")).andReturn(CHILD_NODE_MOCK);        
    EasyMock.expect(CHILD_NODE_MOCK.getPath()).andReturn("/content/viv");
    EasyMock.replay(SESSION_MOCK,ROOT_NODE_MOCK,CONTENT_NODE_MOCK);       

    TestableClass tc = new TestableClass();
    assertEquals("/content/viv", tc.createNode(SESSION_MOCK,"viv"));          

    EasyMock.verify(SESSION_MOCK,CONTENT_NODE_MOCK,ROOT_NODE_MOCK);     
}

获取失败:

org.junit.ComparisonFailure: 预期: 但是是:

任何人都可以告诉我哪里错了,我想通过测试。 谢谢

【问题讨论】:

  • 如果您从createNiceMock 切换到createMock,EasyMock 将在看到未准备好的调用时抛出异常。您可能需要向expect(...).andStubReturn(...) 添加一些额外的调用,但无论如何这将有助于调试。

标签: java unit-testing junit easymock


【解决方案1】:

我认为您的问题在您的方法中围绕以下几行出现:

if( !testNode.hasNode(name) ) {
    testNode.addNode( name, "nt:unstructured" );
}
return testNode.getPath()+"/"+name;

您对它的期望如下:

EasyMock.expect(CONTENT_NODE_MOCK.hasNode("viv")).andReturn(false);        
EasyMock.expect(CONTENT_NODE_MOCK.addNode("viv","nt:unstructured")).andReturn(CHILD_NODE_MOCK);        
EasyMock.expect(CHILD_NODE_MOCK.getPath()).andReturn("/content/viv");

问题在于您的代码没有使用来自addNode() 方法的响应,但是您的测试期望设置为使得代码使用来自addNode() 方法的响应.

在我看来,你有两个选择:

  1. 如果代码是正确的,那么你需要将你的期望调整为这样的:

    EasyMock.expect(CONTENT_NODE_MOCK.hasNode("viv")).andReturn(false);        
    EasyMock.expect(CONTENT_NODE_MOCK.addNode("viv","nt:unstructured")).andReturn(CHILD_NODE_MOCK);        
    EasyMock.expect(CONTENT_NODE_MOCK.getPath()).andReturn("/content/viv");
    
  2. 如果测试是正确的(那很好,TDD 和所有这些),那么您需要将代码更改为如下所示:

    Node childNode = testNode; //Or some other valid creation
    if( !testNode.hasNode(name) ) {
        childNode = testNode.addNode( name, "nt:unstructured" );
    }
    return childNode.getPath()+"/"+name;
    

【讨论】:

    猜你喜欢
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多