Что является аналогом Mockito.spy /doReturn в EasyMock?

Представь, у меня есть следующий класс:

public class TestClass {
    public class Index<X> {

    }
    public class IndexData {
        private final Index<?> index;

        private final ReentrantReadWriteLock lock =
            new ReentrantReadWriteLock();

        public IndexData(final Index<?> index) {
            super();
            this.index = index;
        }

        public Index<?> getIndex() {
            return index;
        }

        public Lock getReadLock() {
            return lock.readLock();
        }

        public Lock getWriteLock() {
            return lock.writeLock();
        }   
    }

    public void add(final InputClass input)
    {
        final IndexData index = getIndex(input);

        final Lock lock = index.getWriteLock();
        lock.lock();
        try {
            // Do something here, which requires synchronization
        } finally {
            lock.unlock();
        }
    }

    protected IndexData getIndex(final InputClass input) {
        // Some logic of getting the index for input
        return null;
    }
}

Я хочу написать модульный тест, который проверяет,

  1. в методе add, index.getWriteLock() используется (не index.getReadLock()),
  2. блокировка взята и
  3. отпущена.

Используя Mockito, я могу написать такой тест:

@Test
public void testAddUsesWriteLock() {
    // Prepare
    final TestClass objectUnderTest = Mockito.spy(new TestClass());
    final InputClass input = Mockito.mock(InputClass.class);
    final IndexData indexData = Mockito.mock(IndexData.class);
    Mockito.doReturn(indexData).when(objectUnderTest).getIndex(input);
    final Lock lock = Mockito.mock(Lock.class);
    Mockito.doReturn(lock).when(indexData).getWriteLock();

    // Invoke method under test
    objectUnderTest.add(input);

    // Verify
    Mockito.verify(indexData).getWriteLock();
    Mockito.verify(indexData, Mockito.never()).getReadLock();
    Mockito.verify(lock).lock();
    Mockito.verify(lock).unlock();
}

Как я могу сделать то же самое с EasyMock?

Конкретно: как я могу метод getIndex вернуть макет в EasyMock (строка Mockito.doReturn(indexData).when(objectUnderTest).getIndex(input))?

Примечание. Вы можете найти код этого примера "> здесь .

7 голосов | спросил DP_ 11 FebruaryEurope/MoscowbWed, 11 Feb 2015 10:01:35 +0300000000amWed, 11 Feb 2015 10:01:35 +030015 2015, 10:01:35

1 ответ


0

В духе предоставления возможного решения (и вопреки моим комментариям выше) вы можете попробовать одно из следующих

Вариант 1

Если TestClass реализует интерфейс, вы можете выполнить аналогичный тест, используя andDelegateTo () , как описано в этом посте, где говорится о Easymock не поддерживает шпионаж

Вариант 2

Удалите свою потребность в шпионаже, расширив TestClass специально для ваших требований к тестированию. Это распространенный подход к работе с устаревшими базами кода, когда вы не можете изменить тестируемый код.

Я буду использовать Mockito в этом примере, чтобы он соответствовал вашему вопросу, однако концепция будет работать с Easymock таким же образом.

public class TestClassUsingMockito {
    /**
    We extend the original class under test so that we can override the creation of IndexData and
    thereby remove the responsibility of creating this object from the @Test method
    */
    private class ClassForTesting extends TestClass {

        private Lock lock;
        private IndexData indexData;

        public ClassForTesting(IndexData indexData, Lock lock) {
            this.indexData = indexData;
            this.lock = lock;
        }

        @Override
        protected IndexData getIndex(InputClass input) {
            return indexData;
        }
    }

    /**
    Look Ma' no more Spys!
    */
    @Test
    public void testAddUsesWriteLock() {        
        // Prepare
        final Lock lock = Mockito.mock(Lock.class);
        final IndexData indexData = Mockito.mock(IndexData.class);
        Mockito.doReturn(lock).when(indexData).getWriteLock();
        // ... now use your new subclass for testing
        final TestClass objectUnderTest = new ClassForTesting(indexData, lock);
        final InputClass input = Mockito.mock(InputClass.class);

        // Invoke method under test
        objectUnderTest.add(input);

        // Verify
        Mockito.verify(indexData).getWriteLock();
        Mockito.verify(indexData, Mockito.never()).getReadLock();
        Mockito.verify(lock).lock();
        Mockito.verify(lock).unlock(); 
    }
}

Что является аналогом Mockito.spy /doReturn в EasyMock?

Таким образом, исключив необходимость использования Spy () в ваших тестах, вызов Mockito

Mockito.doReturn(lock).when(indexData).getWriteLock();

Может быть написано в EasyMock как

expect(indexData.getWriteLock()).andStubReturn(lock);

Пример EasyMock того же теста Mockito, описанного выше

public class TestClassUsingEasymock extends EasyMockSupport {

    private class ClassForTesting extends TestClass {

        private Lock lock;
        private IndexData indexData;

        public ClassForTesting(IndexData indexData, Lock lock) {
            this.indexData = indexData;
            this.lock = lock;
        }

        @Override
        protected IndexData getIndex(InputClass input) {
            return indexData;
        }
    }


    @Test
    public void testAddUsesWriteLock() {
        // Prepare
        final Lock lock = createNiceMock(Lock.class);       
        final IndexData indexData = createNiceMock(IndexData.class);
        EasyMock.expect(indexData.getWriteLock()).andStubReturn(lock);

        // ... now use your new subclass for testing
        final TestClass objectUnderTest = new ClassForTesting(indexData, lock);
        final InputClass input = createNiceMock(InputClass.class);

        lock.lock();
        EasyMock.expectLastCall();

        lock.unlock();
        EasyMock.expectLastCall();

        replayAll();

        // Invoke method under test
        objectUnderTest.add(input);

        // Verify
        verifyAll();
    }
}
ответил Brad 13 FebruaryEurope/MoscowbFri, 13 Feb 2015 13:58:22 +0300000000pmFri, 13 Feb 2015 13:58:22 +030015 2015, 13:58:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132