3

需要帮助是决定需要采取什么方法来测试下面的代码

我有一种方法叫做

private messageDAOInf messageDAO;

public Response verifyUser(Request request) {
    Response response = null;

    if (someCondition) {
        /* -----------Some processing here---------- */
    } else {
        response = constructResponse(errorCode, errorDesc);     
    }

    // Do more processing with messages from response
    response = messageDAOInf
        .convertMessagesAsAppropriate(response);

    return response;
}

我的 EasyMock 代码在这里

/** The message dao inf. */
private MessageDAOInf messageDAOInf;

private VerifyUserService verifyUserServiceI;

@Before

public void setUp() throws Exception {
    messageDAOInf = EasyMock.createMock(MessageDAOInf.class);
    verifyUserService = new VerifyUserService();
    verifyUserService.setMessageDAOInf(messageDAOInf);
}

@Test

public void testErrorResponse() {
    Request request = loadRequest();

    Response response = constructErrorResponse();

    EasyMock.expect(messageDAOInf.convertMessagesAsAppropriate(
        response)).andReturn(response);

    EasyMock.replay(messageDAOInf);

    Response response2 = verifyUserService.verifyUser(request);

    assertFailedResponse(response2);
}

问题是从线

response = constructResponse(errorCode, errorDesc);     

它在 verifyUser 方法中构造错误响应并将其传递给 messageDAOInf.convertMessagesAsAppropriate()

但是通过简单的模拟,它会传递一些其他实例(模拟一个),因此失败并出现错误

java.lang.AssertionError:
  意外的方法调用 convertMessagesAsAppropriate(***Response@1bb35b***):
    convertMessagesAsAppropriate(***Response@1b5d2b2***):预期:1,实际:0
    在 org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:29)
    在 org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:56)

让我知道我应该采取什么方法。谢谢你。

4

2 回答 2

5

您的初始代码期望convertMessagesAsAppropriate将使用您在测试中创建的确切实例调用它Response显然它不会那样做。

EasyMock.anyObject()您所做的更正与使用允许任何Response实例的内置方法基本相同。如果这就是您想在单元测试中检查的全部内容,那很好。或者,您可以在其中添加额外的逻辑ArgumentMatcher来证明Response作为参数传递的确实是 ErrorResponse,或者Capture响应并在您的测试中检查它。这一切都取决于您的测试水平:-)

于 2010-07-23T13:47:49.613 回答
1

我已经找到了这样做的方法。您需要实现接口 org.easymock.IArgumentMatcher

public class ObjectEquals implements IArgumentMatcher {


/** The expected. */
private Object expected;

/**
 * Instantiates a new criterion equals.
 * 
 * @param expected
 *            the expected
 */
public ObjectEquals(final Object expected) {
    this.expected = expected;
}

/* (non-Javadoc)
 * @see org.easymock.IArgumentMatcher#matches(java.lang.Object)
 */
public boolean matches(final Object actual) {
    return expected.getClass().equals(actual.getClass());
}

/* (non-Javadoc)
 * @see org.easymock.IArgumentMatcher#appendTo(java.lang.StringBuffer)
 */
public void appendTo(final StringBuffer buffer) {
    buffer.append("buffer(");
}

}

并在您的测试类中添加方法

/*
     * Eq criterion.
     * 
     * @param criterion the criterion
     * 
     * @return the criterion
     */
    public static <T> T eqCriterion(final Class<T> className, Object object) {
        EasyMock.reportMatcher(new ObjectEquals(object));
        return null;
    }

现在在传递给easymock使用方法eqCriterion时

EasyMock.expect(messageDAOInf.convertMessagesAsAppropriate(         
        response)).andReturn(response);         

简而言之,将上面的行替换为

EasyMock.expect(messageDAOInf.convertMessagesAsAppropriate(         
        eqCriterion(Response.class, response))).andReturn(response);         

这样,它将使用这个模拟响应实例,而不是由实际代码生成的响应实例。

于 2010-07-20T10:35:28.560 回答