EasyMock Unexpected method call expected: 1, actual: 2 java.lang.AssertionError:
EasyMock Unexpected method call expected: 1, actual: 2 java.lang.AssertionError:
尝试测试一种方法,该方法采用对象列表和 returns 排序的对象列表。排序发生在将第一个元素放在列表中且字符串值为空的基础上。测试失败并出现以下错误:
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;
}
}
它调用 getName()
作为排序的一部分(可能多次,具体取决于算法),然后在您的验证中再次调用。由于您对它被调用的次数并不真正感兴趣(因为它不是您测试的合同的一部分),因此请删除默认限制。为此,请将 andReturn
替换为 andStubReturn:
EasyMock.expect(item1.getName()).andStubReturn("com.core");
EasyMock.expect(item2.getName()).andStubReturn("");
EasyMock.expect(item3.getName()).andStubReturn("com.core.FOO");
andStubReturn
确实是当您不知道(也不关心)一个方法将被调用多少次时要走的路。
我想补充一点,我发现您的断言有点奇怪。您知道排序的确切结果。此外,不建议在断言部分调用 mock 的方法。相反,你可以这样做:
assertSame(item2, sortedList.get(0));
assertSame(item1, sortedList.get(1));
assertSame(item3, sortedList.get(2));
尝试测试一种方法,该方法采用对象列表和 returns 排序的对象列表。排序发生在将第一个元素放在列表中且字符串值为空的基础上。测试失败并出现以下错误:
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;
}
}
它调用 getName()
作为排序的一部分(可能多次,具体取决于算法),然后在您的验证中再次调用。由于您对它被调用的次数并不真正感兴趣(因为它不是您测试的合同的一部分),因此请删除默认限制。为此,请将 andReturn
替换为 andStubReturn:
EasyMock.expect(item1.getName()).andStubReturn("com.core");
EasyMock.expect(item2.getName()).andStubReturn("");
EasyMock.expect(item3.getName()).andStubReturn("com.core.FOO");
andStubReturn
确实是当您不知道(也不关心)一个方法将被调用多少次时要走的路。
我想补充一点,我发现您的断言有点奇怪。您知道排序的确切结果。此外,不建议在断言部分调用 mock 的方法。相反,你可以这样做:
assertSame(item2, sortedList.get(0));
assertSame(item1, sortedList.get(1));
assertSame(item3, sortedList.get(2));