簡體   English   中英

Mockito - 如何驗證間接私有字段對象進行的方法調用

[英]Mockito - how to verify a method call made by an indirect private field object

我試圖驗證由間接私有字段對象進行的方法調用。 例如

要測試的代碼:

class A
{
    final private B b;
    public A(C c, D d)
    {
        this.b = new B(c,d);   
    }

    public void methodToTest()
    {
        b.wantToVerifyThisIsCalled();
    }
}

class B
{
   private C c;
   private D d;

   public B(C c, D d)
   {
      this.c = c; 
      this.d = d;
   }
   ...
   public void wantToVerifyThisIsCalled()
   {
       //do stuff 
       return;
   }
}

我想驗證運行A.methodToTest()時是否調用了b.wantToVerifyThisIsCalled()方法;

我試過這樣的東西,但這不起作用:

C c = mock(C.class);
D d = mock(D.class); 
A a = new A(C,D);
B b = moc(B.class);

a.methodToTest();
verify(b).wantToVerifyThisIsCalled();  \\<-- This gives me error, wanted but not invoked

我該如何驗證A類的這個b字段對象確實正在進行該方法調用?

遺憾的是沒有setter方法,字段對象也被標記為final :(

謝謝

之所以發生這種情況,是因為調用了wantToVerifyThisIsCalled()方法的B類對象不是您的wantToVerifyThisIsCalled()對象。 您應該將模擬對象注入A

如果你的A類構造函數直接使用B實例而不是CD ,並依賴它來創建B類對象,那會更好。

嘗試修改您的類:

class A {
    private final B b;
    public A(B b) { this.b = b; }

    public void methodToTest() {
        b.wantToVerifyThisIsCalled();
    }
}

class B {
    private final C c;
    private final D d;
    public B(C c, D d) { this.c = c; this.d = d; }

    public void wantToVerifyThisIsCalled() { ... }
}

然后像這樣測試:

C c = mock(C.class);
D d = mock(D.class); 
B b = mock(B.class);// Find a way to set private fields (May be provide setters).
A a = new A(b);

a.methodToTest();
verify(b).wantToVerifyThisIsCalled();

暫無
暫無

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

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