【问题标题】:EasyMock still goes into implementation of a method mocked with addMockedMethodEasyMock 仍然使用 addMockedMethod 模拟的方法的实现
【发布时间】:2018-04-06 01:06:21
【问题描述】:

我正在尝试用 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


【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      相关资源
      最近更新 更多