EasyMock中Mockito.spy / doReturn的类比是什么?

enti

想象一下,我有以下课程:

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))中返回模拟

注意:您可以在此处找到此示例的代码

布拉德

本着提供可能解决方案的精神(与上述我的评论相反),您可以尝试以下其中一种方法

选项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(); 
    }
}

EasyMock中Mockito.spy / doReturn的类比是什么?

因此,在测试中不再需要Spy()了,Mockito调用

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

可以用EasyMock编写为

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

上面相同的Mockito测试的EasyMock示例

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();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

春季(@SpyBean)VS的Mockito(@Spy)

来自分类Dev

在gnuplot中绘制pm3d映射的python类比是什么?

来自分类Dev

Mockito Spy不会调用真实对象

来自分类Dev

Mockito / Spy无法正常执行原始功能

来自分类Dev

使用sinon spy还原或重置的正确方法是什么?

来自分类Dev

double和spy有什么区别?

来自分类Dev

什么是Java中的类比较差异

来自分类Dev

PowerMock,EasyMock和Mockito框架之间有什么区别?

来自分类Dev

Mockito Spy-调用构造函数之前的存根

来自分类Dev

使用Mockito @Spy批注时未调用@PostConstruct

来自分类Dev

Mockito Spy-部分模拟无法正常工作?

来自分类Dev

Spy++ Win32 API 从 Spy++ 信息中获取 Window 实例

来自分类Dev

为什么Spy ++在控制台窗口中失败

来自分类Dev

为什么在Mockito中使用doReturn无法获得价值

来自分类Dev

Spy ++无法到达Qt应用程序中的按钮

来自分类Dev

关于@Service Spring Boot中的@Spy和@InjectMocks的说明

来自分类Dev

如何在W8中冻结ahk Window Spy

来自分类Dev

sinon spy不在异步回调中包装方法

来自分类Dev

Spy ++无法到达Qt应用程序中的按钮

来自分类Dev

排除p6spy中的include不起作用

来自分类Dev

Mockito @Spy和@Mock之间的区别(answer = Answers.CALLS_REAL_METHODS)

来自分类Dev

关键字“ this”的Scala类型编程类比是什么?

来自分类Dev

有没有办法覆盖 Mockito 中的 doReturn?

来自分类Dev

为什么在角度单元测试中使用Jasmine Spy Object?

来自分类Dev

为什么Qt应用程序仅在运行Spy ++时才创建窗口句柄?

来自分类Dev

为什么我尝试模拟一个@Spy ObjectMapper导致产生NPE?

来自分类Dev

了解 Sinon Spies:调用 spy-wrapped 方法时会发生什么?

来自分类Dev

ahk run pid与Window Spy中显示的不一样

来自分类Dev

在Mockito中什么是“空”对象?

Related 相关文章

  1. 1

    春季(@SpyBean)VS的Mockito(@Spy)

  2. 2

    在gnuplot中绘制pm3d映射的python类比是什么?

  3. 3

    Mockito Spy不会调用真实对象

  4. 4

    Mockito / Spy无法正常执行原始功能

  5. 5

    使用sinon spy还原或重置的正确方法是什么?

  6. 6

    double和spy有什么区别?

  7. 7

    什么是Java中的类比较差异

  8. 8

    PowerMock,EasyMock和Mockito框架之间有什么区别?

  9. 9

    Mockito Spy-调用构造函数之前的存根

  10. 10

    使用Mockito @Spy批注时未调用@PostConstruct

  11. 11

    Mockito Spy-部分模拟无法正常工作?

  12. 12

    Spy++ Win32 API 从 Spy++ 信息中获取 Window 实例

  13. 13

    为什么Spy ++在控制台窗口中失败

  14. 14

    为什么在Mockito中使用doReturn无法获得价值

  15. 15

    Spy ++无法到达Qt应用程序中的按钮

  16. 16

    关于@Service Spring Boot中的@Spy和@InjectMocks的说明

  17. 17

    如何在W8中冻结ahk Window Spy

  18. 18

    sinon spy不在异步回调中包装方法

  19. 19

    Spy ++无法到达Qt应用程序中的按钮

  20. 20

    排除p6spy中的include不起作用

  21. 21

    Mockito @Spy和@Mock之间的区别(answer = Answers.CALLS_REAL_METHODS)

  22. 22

    关键字“ this”的Scala类型编程类比是什么?

  23. 23

    有没有办法覆盖 Mockito 中的 doReturn?

  24. 24

    为什么在角度单元测试中使用Jasmine Spy Object?

  25. 25

    为什么Qt应用程序仅在运行Spy ++时才创建窗口句柄?

  26. 26

    为什么我尝试模拟一个@Spy ObjectMapper导致产生NPE?

  27. 27

    了解 Sinon Spies:调用 spy-wrapped 方法时会发生什么?

  28. 28

    ahk run pid与Window Spy中显示的不一样

  29. 29

    在Mockito中什么是“空”对象?

热门标签

归档