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
方法,这并不是期望的行为。它在处理内部用待测试类创建的实例方面帮助很大。谢谢!