Java JMockit:expection似乎在使用@Mocked时寻找确切的实例

Java JMockit:expection似乎在使用@Mocked时寻找确切的实例,java,unit-testing,jmockit,Java,Unit Testing,Jmockit,我有一个方法,它可以做这样的事情: 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(

我有一个方法,它可以做这样的事情:

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" );
}
我的测试是这样的:

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)的参数0Foo@1a679b7,得到Foo@337d0f

如果我将addNewFoo预期更改为:

m_mockFooList.addNewFoo( (Foo)any );
然后测试工作正常

文件说:

默认情况下,不会验证实例方法调用将发生的确切实例与记录期望时使用的实例相同。也就是说,可以通过将模拟字段/参数注释为@Injectable或使用onInstance(Object)方法来获得实例特定的匹配

但我没有使用@Injectable或onInstance(Object)。我还缺什么吗


使用JMockit v1.7和JUnit v4.8.1.

测试会使事情变得不必要的复杂。请尝试以下操作:

@Test
public void registerNewFoo_fooAddedToList()
{
    Bar bar = new Bar(m_mockFooList);
    bar.registerNewFoo("test id");

    new Verifications() {{ m_mockFooList.addNewFoo((Foo) withNotNull()); }};
}

注意:
m_mockwhoolist.getFoo(…)
默认情况下,如果没有记录期望值,则返回
null

注意,错误消息指的是模拟方法的一个参数,而文档讨论的是调用模拟方法的模拟实例,即
m_mockwhoolist