簡體   English   中英

Mockito間諜測試

[英]Mockito Spy Test

我正在使用Mockito編寫代碼測試。 但是我被困在以下場景中--A類有2個方法,method1()和method2()。 我嘗試使用ArgumentCaptor來捕獲發送到method2()的值。 但是,由於我使用@Spy,我不能使用Matchers。

我如何測試method1()?

class A{
    B b;
    method1(arg1, arg2){
       //some logic
       method2(arg1, arg2, ....argN);
    }

   method2(arg1, arg2,....argN){
       //some logic
       b.method3(arg1, arg2...);
   }
}

如何驗證method2是否收到相同的參數值? 以下是我寫的測試類:

Class TestA{

@Mock
B b;

@Spy
@InjectMocks   //required else b is null
A a = new A();

@Test
public void testMethod1(){

 a.method1(arg1, arg2);

  //How to verify method2 receives same argument values (arg1, arg2)????
  //verify(a, times(1)).method2(.......);   
}

}

我被這篇文章和@David留下的評論所吸引,所以我決定為像我一樣的人編寫一個有效的例子

/*
 * class to test
 */
public class A {

    public void methodA(String str) {
        this.methodB(str);
    }

    protected void methodB(String str) {
        // some implementation
    }
}

我們想斷言傳遞給methodB()的值是我們所期望的。 閱讀ArgumentCaptor讓我發現了等效的Captor Annotation

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MultipleMethodCallTest {

    @Spy
    A a = new A();

    @Captor ArgumentCaptor<String> captor;

    @Test
    public void captureSecondMethodCallArgument() throws Exception {

        // EXPECTED

        String greeting = "hello world";

        // PERFORM TEST

        a.methodA(greeting);

        // ASSERT

        verify(a).methodB(captor.capture());

        assertEquals(greeting, captor.getValue());
    }
}

這個例子進行了測試

  • 的Mockito-ALL-1.8.5.jar
  • JUnit的-4.8.2.jar

你不能,你必須通過B的method3調用驗證它。 如果你對方法2的args對方法3沒有影響,這些args可能根本就沒用了!

你可以使用間諜匹配; 這很好用。 我不知道為什么你認為你不能。

我拿了你的源代碼並編輯它以使其編譯。 然后我添加了對MockitoAnnotations.initMocks的調用 - 你需要這個來創建間諜和模擬,並注入模擬(除非你使用MockitoJUnitRunner ,它為你做initMocks )。 我把verify調用的method2在后面,這工作得很好。

因此,與Omnaest的答案相反,您不需要使用B的方法method3來驗證這一點。 我懷疑你唯一的問題是你忘記了initMocks

祝你好運,如果你需要更多的幫助,請隨時再發帖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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