我有一个类似这样的方法:
public void registerNewFoo( String someId )
{
Foo foo = m_fooList.getFoo( someId );
if ( foo != null )
{
// do something
return;
}
// create new foo
foo = new Foo();
m_fooList.addNewFoo( foo );
}
我的测试是这样的:
@Test
public void registerNewFoo_fooAddedToList( @Mocked final Foo mockFoo )
{
new Expectations()
{{
m_mockFooList.getFoo( "test id" );
result = null;
new Foo();
result = mockFoo;
m_mockFooList.addNewFoo( mockFoo );
}};
Bar bar = new Bar( m_mockFooList );
bar.registerNewFoo( "test id" );
}
运行测试会给我这个错误:
mockit.internal.UnexpectedInvocation:addNewFoo(Foo)的参数0期望Foo @ 1a679b7,得到Foo @ 337d0f
如果我将addNewFoo期望更改为:
m_mockFooList.addNewFoo( (Foo)any );
然后测试工作正常。
文档说:
"默认情况下,实例方法调用发生的确切实例未经验证与记录期望时使用的实例相同。也就是说,可以通过将模拟字段/参数注释为@Injectable或使用onInstance(Object)方法来获取特定于实例的匹配。"
但我没有使用@Injectable或onInstance(Object)。我错过了别的什么吗?
使用JMockit v1.7和JUnit v4.8.1。
答案 0 :(得分:1)
测试不必要地使事情变得复杂。请尝试以下方法:
@Test
public void registerNewFoo_fooAddedToList()
{
Bar bar = new Bar(m_mockFooList);
bar.registerNewFoo("test id");
new Verifications() {{ m_mockFooList.addNewFoo((Foo) withNotNull()); }};
}
注意:m_mockFooList.getFoo(...)
默认情况下会返回null
,如果没有记录预期。