java - Mockito - 如何验证间接私有(private)字段对象进行的方法调用

标签 java mockito verify

我正在尝试验证由间接私有(private)字段对象进行的方法调用。例如

要测试的代码:

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 类对象不是您的模拟对象。您应该将模拟对象注入(inject) 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();

关于java - Mockito - 如何验证间接私有(private)字段对象进行的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24598704/

相关文章:

java - 将大图像保存为 PNG

java - 在 gnupg-for-java 中提供 GnuPG key 的密码

java - 在命令行中运行 "./gradlew <task>"时,读取的是什么文件?

java - 如何验证使用 mockito 调用公共(public)类的静态方法?

ruby-on-rails - 我在 Windows 7 上为 Ruby on Rails 安装 Bundler 时得到 "Certificate Verify Failed"。Ruby 1.9.3

java - 使用 HTML 而不是 Swing 组件在 Java 桌面应用程序中创建表单是一个好习惯吗?

java - 如何模拟未在模块中声明的注入(inject)对象?

android - 为什么我的 Android 单元测试一起运行时失败,但单独运行时通过?

c - 在 C 中使用 strtok 进行字符串解析

Paypal 付款验证