Java 使用EasyMock创建列表

Java 使用EasyMock创建列表,java,junit,easymock,Java,Junit,Easymock,我目前正在学习EasyMock,我已经阅读了一些关于它的教程。基于我所获得的知识,我尝试创建一个模拟列表,但它给了我断言错误,我无法理解其原因 基本上,我想要一个列表,第一个元素是1133L,第二个元素是1139L,它的大小自然是2 我的方法 @Test public void testCreateIdealConf() { List< Long > idList = createMock( List.class ); expect( idList.get( 0 ) ).andR

我目前正在学习EasyMock,我已经阅读了一些关于它的教程。基于我所获得的知识,我尝试创建一个模拟列表,但它给了我断言错误,我无法理解其原因

基本上,我想要一个列表,第一个元素是1133L,第二个元素是1139L,它的大小自然是2

我的方法

@Test
public void testCreateIdealConf()
{

List< Long > idList = createMock( List.class );

expect( idList.get( 0 ) ).andReturn( 1133L );
expect( idList.get( 1 ) ).andReturn( 1139L );
expect( idList.size() ).andReturn( 2 );

replay( idList );

for( int i = 0; i < idList.size(); i++ )
{
  System.out.println( "Elements: " + idList.get( i ) );
}
}

我在哪里犯了错误,或者从模拟对象/列表中排除了错误?

看起来你在告诉它期待:

get(0)
get(1)
size()
但实际的方法调用是:

size()
get(0)
size()
get(1)
size()
使用anyTimes()方法禁用对调用顺序和调用执行的检查

expect(idList.get(0)).andReturn(1133L).anyTimes();
expect(idList.get(1)).andReturn(1139L).anyTimes();
expect(idList.size()).andReturn(2).anyTimes();

您不需要for循环中的
.size()
调用,请尝试:

int listSize = 2 ;
expect(idList.size()).andReturn(listSize).times(listSize+1);
expect(idList.get(0)).andReturn(1133L);
expect(idList.get(1)).andReturn(1139L);

我没有使用easymock,但您似乎告诉它期望
get(0),get(1),size()
,但实际的方法调用是:
size(),get(0),size(),get(1),size()
@khelwood现在,根据您的回答,我已经测试过了,您是对的。顺序也很重要:)如果您将评论更改为答案,它将被接受为解决方案。酷。很高兴我能帮忙。请注意:我想这只是为了了解EasyMock的工作原理。。。因为在现实中,你不需要做这样的事情。你知道,你使用一个模拟框架来处理你真正需要控制的事情。列表。。。你真的不需要控制。我的意思是:如果您有处理特定列表的“测试中的代码”,那么只需创建一个普通列表,并将其提供给您的测试中的类。然后,在给定输入的情况下,验证代码是否执行了预期的操作。你真的不应该用你传递给它的列表对象来验证你的代码在做什么@Jägermeister你是对的。创建一个普通列表,然后将该列表传递给方法更容易。然而,作为这个框架的新手,我只想利用框架提供的所有可能性:)在正常情况下,我会介意你在这里写的东西。谢谢你的回答。我认为,在默认情况下,只要使用createMock而不是createStrictMock,检查调用顺序和调用执行就会被禁用。
int listSize = 2 ;
expect(idList.size()).andReturn(listSize).times(listSize+1);
expect(idList.get(0)).andReturn(1133L);
expect(idList.get(1)).andReturn(1139L);