web-dev-qa-db-ja.com

Easymock isAとanyObject

違いは何ですか

EasyMock.isA(String.class) 

そして

EasyMock.anyObject(String.class)

(または提供される他のクラス)

どの状況でどちらを使用しますか?

16
emilyk

違いは、ヌルのチェックです。 isAはnullの場合はfalseを返しますが、anyObjectはnullの場合もtrueを返します。

import static org.easymock.EasyMock.*;
import org.easymock.EasyMock;
import org.testng.annotations.Test;


public class Tests {


    private IInterface createMock(boolean useIsA) {
        IInterface testInstance = createStrictMock(IInterface.class);
        testInstance.testMethod(
                useIsA ? isA(String.class) : anyObject(String.class)
        );
        expectLastCall();
        replay(testInstance);
        return testInstance;
    }
    private void runTest(boolean isACall, boolean isNull) throws Exception {
        IInterface testInstance = createMock(isACall);
        testInstance.testMethod(isNull ? null : "");
        verify(testInstance);
    }
    @Test
    public void testIsAWithString() throws Exception {
        runTest(true, false);
    }
    @Test
    public void testIsAWithNull() throws Exception {
        runTest(true, true);
    }
    @Test
    public void testAnyObjectWithString() throws Exception {
        runTest(false, true);
    }
    @Test
    public void testAnyObjectWithNull() throws Exception {
        runTest(false, false);
    }

    interface IInterface {
        void testMethod(String parameter);
    }
}

この例では、testIsAWithNullが失敗するはずです。

22
terjekid

APIドキュメントのEasyMock.isA()が呼び出されたクラスオブジェクトを返すと言われているため、Easymockのドキュメントと本当に混乱しましたが、Easymockのドキュメント(isA(Class clazz)の場合)によると

実際の値が指定されたクラスのインスタンスである場合、または指定されたクラスを拡張または実装するクラスのインスタンスである場合に一致します。 nullは常にfalseを返します。オブジェクトに使用できます。

anyObject()の場合

任意の値に一致します。

ここでドキュメントを見ることができます

これらの2つの方法の間に具体的な違いは述べられていません。

3
Vihar