EasyMock仍然会实现使用addMockedMethod模拟的方法

问题描述 投票:0回答:2

我正在尝试用Java编写单元测试。由于Java类的结构,我必须想出一种方法,无论何时调用类的构造函数,都会创建该类的模拟对象。我想模拟该类的2个方法。

CallToBeMocked mockCallToBeMocked = EasyMock.createMockBuilder(CallToBeMocked.class)
                .withConstructor(ArgumentA.class, ArgumentB.class, ArgumentC.class)
                .withArgs(mockArgumentA, mockArgumentB, mockArgumentC)
                .addMockedMethod("isProxied", ArgumentA.class)
                .addMockedMethod("remoteCall", String.class, ArgumentA.class, Object.class)
                .createMock();

 EasyMock.expect(mockCallToBeMocked.isProxied(mockArgumentA)).andReturn(false);
 EasyMock.expect(mockCallToBeMocked.remoteCall("ip-address", mockArgumentA, null)).andThrow(new Exception()).times(3);

问题是虽然我已经明确指出必须嘲笑isProxiedremoteCall方法并且我已经对这些方法给出了适当的期望,但它仍然开始进入这些方法的实际实现。

java unit-testing easymock
2个回答
0
投票

它应该完美的工作。所以其他事情正在发生。这是一个基于您的代码的工作示例。与实际实施有什么不同?

public class PartialTest {

    public interface ArgumentA { }
    public interface ArgumentB { }
    public interface ArgumentC { }

    public static class CallToBeMocked {
        public CallToBeMocked(ArgumentA a, ArgumentB b, ArgumentC c) {

        }

        public boolean isProxied(ArgumentA a) {
            return true;
        }

        public int remoteCall(String ip, ArgumentA a, Object any) throws Exception {
            return 0;
        }
    }

    @Test
    public void test() throws Exception {
        ArgumentA mockArgumentA = createNiceMock(ArgumentA.class);
        ArgumentB mockArgumentB = createNiceMock(ArgumentB.class);
        ArgumentC mockArgumentC = createNiceMock(ArgumentC.class);

        CallToBeMocked mockCallToBeMocked = createMockBuilder(CallToBeMocked.class)
                .withConstructor(ArgumentA.class, ArgumentB.class, ArgumentC.class)
                .withArgs(mockArgumentA, mockArgumentB, mockArgumentC)
                .addMockedMethod("isProxied", ArgumentA.class)
                .addMockedMethod("remoteCall", String.class, ArgumentA.class, Object.class)
                .createMock();

        expect(mockCallToBeMocked.isProxied(mockArgumentA)).andReturn(false);
        expect(mockCallToBeMocked.remoteCall("ip-address", mockArgumentA, null)).andThrow(new Exception()).times(3);

        replay(mockCallToBeMocked);

        assertFalse(mockCallToBeMocked.isProxied(mockArgumentA));
        try {
            mockCallToBeMocked.remoteCall("ip-address", mockArgumentA, null);
            fail("Should throw");
        } catch (Exception e) { }
        try {
            mockCallToBeMocked.remoteCall("ip-address", mockArgumentA, null);
            fail("Should throw");
        } catch (Exception e) { }
        try {
            mockCallToBeMocked.remoteCall("ip-address", mockArgumentA, null);
            fail("Should throw");
        } catch (Exception e) { }

        verify(mockCallToBeMocked);
    }
}

-2
投票

如果我们不依赖于EasyMock,这里可以使用Mockito实现相同的功能。

import static org.mockito.Mockito.verify;

import org.mockito.Mockito;

....

ClassToBeMocked myMock = Mockito.mock(ClassToBeMocked.class);

Mockito
    .when(myMock.isProxied(any(ArgumentA.class)))
    .thenReturn(false);

Mockito
    .when(myMock.remoteCall(any(String.class), any(ArgumentA.class), any(Object.class)))
    .thenThrow(new Exception("monkeys"));

<USE ``myMock``>

verify(myMock, times(1)).isProxied(mockArgumentA);
verify(myMock, times(3)).remoteCall("ip-address", mockArgumentA, null);
© www.soinside.com 2019 - 2024. All rights reserved.