EasyMock预期的意外方法调用:1,实际:2 java.lang.AssertionError:

时间:2017-05-11 07:58:44

标签: java easymock

尝试测试一个获取对象列表并返回已排序对象列表的方法。排序是基于将第一个元素放在具有空字符串值的列表的基础上进行的。测试失败,出现以下错误:

java.lang.AssertionError: 
Unexpected method call LoggerConfig.getName():
LoggerConfig.getName(): expected: 1, actual: 2

此处的问题是期望明确的通话次数。这里似乎经常调用该方法,这会引发一个异常,即该方法被调用了太多次。在第一次方法调用超过限制时立即发生故障(取自EasyMock指南)。 问题是如何在此上下文中修复它?我在哪里做错了?

EasyMock代码:

public class SorterTest {
private Sorter tested;
LoggerConfig item1;
LoggerConfig item2;
LoggerConfig item3;
List<LoggerConfig> sortedList;

@Before
public void setUp() {
    tested = new Sorter();
}

private List<LoggerConfig> makeUnsortedList() {
    item1 = EasyMock.mock(LoggerConfig.class);
    item2 = EasyMock.mock(LoggerConfig.class);
    item3 = EasyMock.mock(LoggerConfig.class);

    EasyMock.expect(item1.getName()).andReturn("com.core");
    EasyMock.expect(item2.getName()).andReturn("");
    EasyMock.expect(item3.getName()).andReturn("com.core.FOO");

    List<LoggerConfig> unsortedList = new ArrayList<>();
    unsortedList.add(item1);
    unsortedList.add(item2);
    unsortedList.add(item3);


    return unsortedList;
}

@Test
public void testSort() {

    List<LoggerConfig> unsortedList = makeUnsortedList();
    EasyMock.replay(item1,item2,item3);

    List<LoggerConfig> sortedList = tested.sort(unsortedList);

    assertTrue(sortedList.get(0).getName().isEmpty());
    assertTrue(sortedList.get(1).equals("com.core") || sortedList.get(1).equals("com.fwk.core.EBCTestClass"));
    assertTrue(sortedList.get(2).equals("com.core") || sortedList.get(2).equals("com.core.FOO"));

}

}

测试以下方法:

class Sorter {

  List<LoggerConfig> sort(List<LoggerConfig> unSortedList) {

    List<LoggerConfig> sortedList = new ArrayList<>(unSortedList);

    Collections.sort(sortedList, new Comparator<LoggerConfig>() {
        @Override
        public int compare(LoggerConfig o1, LoggerConfig o2) {
            return (o1.getName().compareTo(o2.getName()));
        }
    });

    return sortedList;
  }
}  

2 个答案:

答案 0 :(得分:4)

它正在调用getName()作为排序的一部分(可能多次,具体取决于算法),然后再次在您的验证中。由于您对调用它的次数并不感兴趣(因为它不是您测试合同的一部分),因此请删除默认限制。为此,请将andReturn替换为andStubReturn

EasyMock.expect(item1.getName()).andStubReturn("com.core");
EasyMock.expect(item2.getName()).andStubReturn("");
EasyMock.expect(item3.getName()).andStubReturn("com.core.FOO");

答案 1 :(得分:0)

当你不知道(并且不关心)方法被调用多少次时,

andStubReturn确实是要走的路。

我想补充一点,我发现你的断言有点奇怪。你知道排序的确切结果。此外,建议不要在断言部分中调用mock上的方法。相反,你可以这样做:

assertSame(item2, sortedList.get(0));
assertSame(item1, sortedList.get(1));
assertSame(item3, sortedList.get(2));