3

以下のコードをテストするために必要なアプローチを決定するのに助けが必要です

と呼ばれる1つのメソッドがあります

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単体テストで確認したいことがそれだけであれば、それで問題ありません。または、引数として渡された が実際に ErrorResponse または応答でArgumentMatcherあることを証明するロジックを追加して、テストで調べることもできます。これはすべて、テストのレベルに依存します:-)ResponseCapture

于 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 に答える