Java 如何使用EasyMock对一个方法进行单元测试,该方法对我想要模拟的类进行多个内部调用

Java 如何使用EasyMock对一个方法进行单元测试,该方法对我想要模拟的类进行多个内部调用,java,unit-testing,easymock,Java,Unit Testing,Easymock,我想使用EasyMock对一个我想要模拟的类进行多个内部调用的方法进行单元测试 该测试方法实际上运行了5次,并调用mocked方法 在每个循环中,我将创建一些对象,它们都属于同一个类(比如说类A)。 私有方法将调用获取类A实例的mock对象方法,对其求值并返回结果 最后,public方法将返回一个结果列表 我尝试了标准的EasyMock.expect(MockClass.method(A)).andReturn(),但它不起作用,因为类A没有实现equals(): // this is the

我想使用
EasyMock
对一个我想要模拟的类进行多个内部调用的方法进行单元测试

该测试方法实际上运行了5次,并调用mocked方法

在每个循环中,我将创建一些对象,它们都属于同一个类(比如说类A)。 私有方法将调用获取类A实例的mock对象方法,对其求值并返回结果

最后,public方法将返回一个结果列表

我尝试了标准的
EasyMock.expect(MockClass.method(A)).andReturn()
,但它不起作用,因为类
A
没有实现
equals()

// this is the method example I am trying to test
public methodToTest(){
     // some logic
      privateMethodToTest(x);
     // some logic 
}
private List<B> privateMethodToTest(int x){
  List<B> list = new ArrayList<>();
  List<A> all = getObjects(x); //getObjects private method
  for (A a:all){
    list.add(objectToMock.methodToMock(a));
    return list;
  }

我不知道怎么做,也找不到任何类似的例子或问题的答案。

当单元测试时,我们验证被测代码的公共可观察行为,即返回值和与依赖项的通信


其他的都是我们不测试的实现细节。原因是您可能希望重构代码。这意味着您希望在不改变代码行为的情况下改进代码的结构。您的单元测试将验证您没有意外更改行为。但是,只有在您不必更改它们的情况下,它们才能执行此操作。

您需要另一个匹配器。默认情况下,EasyMock将使用
equals
进行匹配。但你不能那样做。你的基本选择是:

  • 你不在乎精确匹配
  • 如果对你来说似乎是最容易的。这意味着做:

    expect(objectToMock.methodToMock(anyObject()).andReturn("B object number 1");
    expect(objectToMock.methodToMock(anyObject()).andReturn("B object number 2");
    
  • 使用比较仪
  • 根据你的评论,你可能更喜欢这个

    expect(mock.methodToTest(EasyMock.cmp(new A(1), Comparator.comparingInt(A::getValue), LogicalOperator.EQUAL))).andReturn(1);
    
    唯一的问题是,您需要一个具有正确值的
    a
    进行比较

  • 要获得简化版本,您可以使用自己的matcher
  • 使用下面的自定义匹配器的期望值

    expect(mock.methodToTest(cmp(0))).andReturn(3);
    
    public static <T> T cmp(int value) {
        reportMatcher(new IArgumentMatcher() {
            @Override
            public boolean matches(Object argument) {
                return value == ((A) argument).getValue();
            }
    
            @Override
            public void appendTo(StringBuffer buffer) {
                buffer.append("A.value=").append(value);
            }
        });
        return null;
    }
    
    expect(mock.methodToTest(cmp(0)).andReturn(3);
    公共静态T cmp(int值){
    reportMatcher(新的IArgumentMatcher(){
    @凌驾
    公共布尔匹配(对象参数){
    返回值==((A)参数).getValue();
    }
    @凌驾
    公共无效附件(StringBuffer缓冲区){
    buffer.append(“A.value=”).append(value);
    }
    });
    返回null;
    }
    
    类中添加
    等于
    实现在概念上有什么错误吗?似乎是一个最佳实践IMHO。我同意,但是这个类已经给出,并且已经大量使用,更改它将需要很多其他测试,虽然理论上这对其他代码没有影响。如果没有其他选择,我会这样做,但如果可能,我想避免它转到EasyMock文档,并查看章节
    使用参数匹配器的灵活预期
    ;您可以根据一些其他属性(假设它有任何属性)匹配
    类。
    
    expect(mock.methodToTest(cmp(0))).andReturn(3);
    
    public static <T> T cmp(int value) {
        reportMatcher(new IArgumentMatcher() {
            @Override
            public boolean matches(Object argument) {
                return value == ((A) argument).getValue();
            }
    
            @Override
            public void appendTo(StringBuffer buffer) {
                buffer.append("A.value=").append(value);
            }
        });
        return null;
    }