Mockito:一个类的所有实例的模拟实例方法

2022-09-01 19:32:41

我正在尝试存根特定类的实例方法,以便当此类的任何实例调用此实例方法时,将返回相同的实例方法(请参阅下面的代码)。但是,mockito不允许任何匹配器进行验证或存根。FoodoSomethingobject

Bar object = new Bar();
given(any(Foo.class).doSomething(Arg.class)).willReturn(object);

在 :Foo.class

Bar doSomething(Arg param) {
    Bar bar = new Bar();
    // Do something with bar
    return bar;
}

我有什么办法可以用Mockito实现这个目标吗?谢谢!


答案 1

如果要返回在 的任何实例上调用方法时的同一实例,则应使用 PowerMock。下面是一个示例:FooBardoSomethingFoo

@RunWith(PowerMockRunner.class)
@PrepareForTest(Foo.class)
public class FooMockAllInstanceTest {

    @Test
    public void testMockInstanceofObjectCreation() throws Exception {
        Bar mockBar = PowerMockito.mock(Bar.class);
        when(mockBar.sayHello()).thenReturn("Hi John!");
        PowerMockito.whenNew(Bar.class)
                .withNoArguments()
                .thenReturn(mockBar);

        Foo myFooOne = new Foo();
        assertEquals(mockBar,  myFooOne.doSomething("Jane"));

        Foo myFooTwo = new Foo();
        assertEquals(mockBar,  myFooTwo.doSomething("Sarah"));

        Baz bazOne = new Baz();
        assertEquals(mockBar, bazOne.doSomething("Sam"));

        Baz bazTwo = new Baz();
        assertEquals(mockBar, bazTwo.doSomething("Nina"));
    }
}

此示例将返回相同的对象,即使调用也是如此。这是课程,BarBazBaz

public class Baz {

    public Bar doSomething(String name) {
        Foo foo = new Foo();
        return foo.doSomething(name);
    }
}

更新 2

还有另一种稍微好一点的方法来测试PowerMock。在这里,

@Test
public void testStubbingMethod() throws Exception {
    Bar mockBar = PowerMockito.mock(Bar.class);
    when(mockBar.sayHello()).thenReturn("Hi John!");

    PowerMockito.stub(PowerMockito.method(Foo.class, "doSomething",
            String.class)).toReturn(mockBar);

    Foo myFooOne = new Foo();
    assertEquals(mockBar, myFooOne.doSomething("Jane"));

    Foo myFooTwo = new Foo();
    assertEquals(mockBar, myFooTwo.doSomething("Sarah"));

    Baz bazOne = new Baz();
    assertEquals(mockBar, bazOne.doSomething("Sam"));

    Baz bazTwo = new Baz();
    assertEquals(mockBar, bazTwo.doSomething("Nina"));
}

答案 2

推荐