私は既存のクラスのテストを書こうとしています。以下はモック内側の最終オブジェクト
class ClassToBeTested {
private final Obj1 a;
ClassToBeTested(String anotherVariable) {
a = new Obj1(anotherVariable);
}
public void methodToBeTested() {
if(invokeSomeOtherMethod()) {
a.getAnotherVariable().doSomething();
}
}
public boolean invokeSomeOtherMethod() {
// return true or false based on some logic
}
Obj1 getObj1() {
return a;
}
}
私のテストクラスである:
class TestClass {
@Test
public void testMethod() {
ClassToBeTested x = new ClassToBeTested("someString");
ClassToBeTested spyX = spy(x);
doReturn(false).when(spyX).invokeSomeOtherMethod();
spyX.methodToBeTested();
verify(spyX, times(1)).getObj1().doSomething();
}
}
これが私の理解です: OBJ1は、クラスのコンストラクタで作成された民間最終的なオブジェクトであるので、それが直接試験方法でアクセスされないことがどちらもobj1の模擬バージョンを使用するようにspyObjectを強制することもできません。
また以来(検証)がOBJ1の嘲笑バージョンを必要とし、それは私にエラーがスローされます: Wanted But Not invoked: x.getObj1(), however there are otherInteractions with this mock: x.invokeSomeOtherMethod()
は間違って私の理解ですか? testMoethod()をテストする方法は何でしょうか?
コンストラクタを変更して、 'a'を注入しますか? –
プロジェクトの複数のファイルに変更を加える必要があるので、私はそれを避けたいと思います。また、 'anotherVariable'は現在使用されていない文字列であるため、aの初期化はそれを呼び出すコードに直接依存しません。 – learningMyWayThru
あなたのコードを理解できません。クラスには1つのコンストラクタだけが表示されます。パラメータのないコンストラクタはありません。しかし、あなたはテストメソッドでパラメータなしのコンストラクタを使用しています。どちらが正しいですか? –