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

ddo*_*lce 15 java junit mockito

我正在尝试存根特定类的实例方法,以便当此类的任何实例Foo调用此实例方法时doSomething,object返回相同的内容(请参阅下面的代码).但是,mockito不允许任何匹配者在验证或存根之外.

Bar object = new Bar();
given(any(Foo.class).doSomething(Arg.class)).willReturn(object);
Run Code Online (Sandbox Code Playgroud)

并在Foo.class:

Bar doSomething(Arg param) {
    Bar bar = new Bar();
    // Do something with bar
    return bar;
}
Run Code Online (Sandbox Code Playgroud)

我可以通过Mockito实现这一目标吗?谢谢!

Ind*_*sak 5

这应该工作:

 public class FooTest {
     @Mock
     private Foo foo;

     ...
     @Before
     public void setUp() {
        MockitoAnnotations.initMocks(this);
     }

     @Test
     public void testSomething() {
        Bar object = new Bar();
        when(foo.doSomething(any(Any.class))).thenReturn(object);
        ...
     }
}
Run Code Online (Sandbox Code Playgroud)

更新1

如果要在的任何实例上调用method 时返回相同的实例,则应使用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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class Baz {

    public Bar doSomething(String name) {
        Foo foo = new Foo();
        return foo.doSomething(name);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新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"));
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来它不能解决OP的问题。OP希望在“ Foo” **的“ **”实例上调用`doSomething`方法应返回特定对象。在这个答案中,只有在这个特定的Foo实例上调用方法时,该实例是类FooTest的私有成员,才会返回该特定对象。假设要测试的类是“ Baz”,它有自己的“ Foo”实例,并在其方法之一中对其调用“ doSomething”,这是将被调用的“ real **” doSomething`方法,并且那不是理想的行为。 (7认同)