[英]Spy an already initialized Java object Mockito
I am using the Mocktio library to write some test cases, since I have an elaborate inhertance structure, I have a few objects which are instantiated in the parent class, and I would like to mock one of its function call. 我正在使用Mocktio库来编写一些测试用例,因为我有一个精心设计的inhertance结构,我有一些在父类中实例化的对象,我想模拟它的一个函数调用。 Does Mockito library provide any way to spy on a already initialized object? Mockito库是否提供了监视已初始化对象的任何方法?
Also, the object is not directly instantiable. 此外,该对象不能直接实例化。
Similar to the following - 类似于以下 -
public class A {
protected static MyObject a;
public static void someMethod() {
a = myObjectBuilder.createObj();
}
}
And another class B looks something similar to 而另一个B类看起来类似于
class B extends A {
@BeforeClass
public static void setUpBeforeClass() {
someMethod();
}
@Test
public void mockTest() {
// now mock behavior of some method of MyObject a
// Missing line to spy object a.
Mockito.doReturn(false).when(a).xyz();
/* Now call some method that triggers a.xyz()
again, it is not a direct call,
there are multiple layer of abstraction
*/
}
}
Edit: I have tried the following and it does not work 编辑:我尝试了以下,但它不起作用
MyObject mock_object = Mockito.spy(a);
Mockito.doReturn(false).when(mock_object).xyz();
Basically, don't do initialisation in BeforeClass, it runs only once but you need to have new spy in each test, or you must "reinitialise" spy object before each test. 基本上,不要在BeforeClass中进行初始化,它只运行一次但是你需要在每次测试中都有新的间谍,或者你必须在每次测试之前“重新初始化”间谍对象。 Please examine this code: 请检查此代码:
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
import static org.assertj.core.api.Assertions.assertThat;
class MyObject{
public String cos;
public MyObject(String cos) {
this.cos = cos;
}
public boolean xyz() {
return true;
}
}
class A {
protected static MyObject a;
public void someMethod() {
a = new MyObject("cccc");
}
}
public class B extends A {
@Before
public void setUpBeforeTest() {
someMethod();
}
@Test
public void mockTest() {
MyObject mock_object = Mockito.spy(a);
Mockito.doReturn(false).when(mock_object).xyz();
assertThat(mock_object.xyz()).isFalse();
}
@Test
public void mockTest2() {
MyObject mock_object = Mockito.spy(a);
Mockito.doReturn(true).when(mock_object).xyz();
assertThat(mock_object.xyz()).isTrue();
}
}
If you want it your way, please change: 如果您想按自己的方式使用,请更改:
public void someMethod() {
a = myObjectBuilder.createObj();
}
into: 成:
public static void someMethod() {
a = myObjectBuilder.createObj();
}
You can't call non static method from static initialiser @BeforeClass: 您不能从静态初始化器@BeforeClass调用非静态方法:
class A {
protected static MyObject a;
public static void someMethod() {
a = new MyObject("cccc");
}
}
public class B extends A {
@BeforeClass
public static void setUpBeforeClass() {
someMethod();
}
@Test
public void mockTest() {
MyObject mock_object = Mockito.spy(a);
Mockito.doReturn(false).when(mock_object).xyz();
assertThat(mock_object.xyz()).isFalse();
}
@Test
public void mockTest2() {
MyObject mock_object = Mockito.spy(a);
// Here we replace original object with our spy
A.a = mock_object;
Mockito.doReturn(false).when(mock_object).xyz();
assertThat(a.xyz()).isFalse();
}
}
Another example (in this case we replace object a with mock (spy is not needed): 另一个例子(在这种情况下,我们用mock替换对象a (不需要spy):
class MyObject{
public String cos;
public MyObject(String cos) {
this.cos = cos;
}
public boolean xyz() {
return true;
}
}
class A {
protected MyObject a;
public A() {
a = new MyObject("ggggg");
}
public String doSomethingWithA(){
if(a.xyz()){
return a.cos;
}
else{
return "aaaa";
}
}
}
@RunWith(MockitoJUnitRunner.class)
public class B {
@Mock
MyObject mock_object;
@InjectMocks
A systemUnderTest = new A();
@Test
public void mockTest1() {
Mockito.doReturn(false).when(mock_object).xyz();
assertThat(systemUnderTest.doSomethingWithA()).isEqualTo("aaaa");
}
@Test
public void mockTest2() {
Mockito.doReturn(true).when(mock_object).xyz();
assertThat(systemUnderTest.doSomethingWithA()).isNull();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.