間接プライベートフィールドオブジェクトによって行われたメソッド呼び出しを検証しようとしています。例えば
テストするコード:
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としてマークされています:(
ありがとうございました
これは、メソッドが呼び出されるB
クラスオブジェクトがwantToVerifyThisIsCalled()
モックオブジェクトではないために発生しています。むしろモックオブジェクトをに注入する必要がありますA
。
A
クラスコンストラクターB
がC
andではなくインスタンスを直接D
取得し、それに依存して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();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加