Подтвердить что ты не робот

Easymock isA vs anyObject

В чем разница между

EasyMock.isA(String.class) 

и

EasyMock.anyObject(String.class)

(или любой другой класс)

В каких ситуациях вы могли бы использовать один над другим?

4b9b3361

Ответ 1

Разница заключается в проверке Nulls. IsA возвращает false, когда null, но anyObject возвращает true для null.

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 должен завершиться ошибкой.

Ответ 2

Я действительно запутался в документации Easymock, так как EasyMock.isA() в документах API, как говорят, возвращает объект класса, на который он вызывается, но документация Easymock (для isA (Class clazz)) гласит, что

Соответствует, если фактическое значение является экземпляром данного класса, или если оно находится в экземпляре класса, который расширяет или реализует данный класс. Null всегда возвращает false. Доступно для объектов.

для anyObject() он говорит

Соответствует любому значению.

Вы можете посмотреть здесь Документацию

нет никакой конкретной разницы, упомянутой между этими двумя методами.