Java Mockito:类的所有实例的mock实例方法

Java Mockito:类的所有实例的mock实例方法,java,junit,mockito,Java,Junit,Mockito,我试图存根一个特定类的实例方法,这样当这个Foo类的任何实例调用这个实例方法doSomething时,都会返回相同的对象(参见下面的代码)。但是,mockito不允许在验证或存根之外使用任何匹配器 Bar object = new Bar(); given(any(Foo.class).doSomething(Arg.class)).willReturn(object); 在Foo.class中: Bar doSomething(Arg param) { Bar bar = new B

我试图存根一个特定类的实例方法,这样当这个
Foo
类的任何实例调用这个实例方法
doSomething
时,都会返回相同的
对象
(参见下面的代码)。但是,mockito不允许在验证或存根之外使用任何匹配器

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实现这个目标吗?谢谢

如果希望
Foo
在对
Foo
的任何实例调用
doSomething
方法时返回相同的
Bar
实例,则应使用PowerMock。下面是一个例子:

@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"));
    }
}
此示例将返回相同的
Bar
对象,即使调用
Baz
。这是
Baz
课程

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"));
}

没有恶意破解的解决方案将是一个私有方法,带有一个
布尔
参数,用于返回相同的值。然后您的公共方法将调用该方法(因为您正在尝试查找自调用者)。除此之外,您正在阅读堆栈。有人知道如何在scala中执行此操作吗?这是一个良好的开端-很高兴您在我的答案中为概念性解释留出了一些空间;-)这看起来并不能解决OP的问题。OP希望对
Foo
的任何实例调用方法
doSomething
都应该返回一个特定的对象。在这个答案中,只有在这个特定的
Foo
实例上调用该方法,该实例是类
FooTest
的私有成员,才会返回特定的对象。假设被测试的类是
Baz
,它有自己的
Foo
实例,并在其中一个方法中调用
doSomething
,将调用的是真正的
doSomething
方法,这并不是期望的行为。它在处理内部用待测试类创建的实例方面帮助很大。谢谢!