簡體   English   中英

間諜已經初始化的Java對象Mockito

[英]Spy an already initialized Java object Mockito

我正在使用Mocktio庫來編寫一些測試用例,因為我有一個精心設計的inhertance結構,我有一些在父類中實例化的對象,我想模擬它的一個函數調用。 Mockito庫是否提供了監視已初始化對象的任何方法?

此外,該對象不能直接實例化。

類似於以下 -

     public class A {
        protected static MyObject a;
        public static void someMethod() {
          a = myObjectBuilder.createObj(); 
        }
     }

而另一個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 
         */
       }
     }

編輯:我嘗試了以下,但它不起作用

   MyObject mock_object = Mockito.spy(a);
   Mockito.doReturn(false).when(mock_object).xyz();

基本上,不要在BeforeClass中進行初始化,它只運行一次但是你需要在每次測試中都有新的間諜,或者你必須在每次測試之前“重新初始化”間諜對象。 請檢查此代碼:

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

}

如果您想按自己的方式使用,請更改:

public void someMethod() {
      a = myObjectBuilder.createObj(); 
}

成:

public static void someMethod() {
      a = myObjectBuilder.createObj(); 
}

您不能從靜態初始化器@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();
}
}

另一個例子(在這種情況下,我們用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM