2017-01-18 3 views
0

私は単体テストであるサンプルクラス "A"を持っています。私はクラス "X"の振る舞いを、私が私のユニットテストで指定した乱数を、生成された値よりも与えるように指示する必要があります。私はどのクラスを擬似すべきか分からず、抽象クラス "Y"から継承するメソッド "getGen()"を除いてXの動作を持たせる必要があります。私はやってみたいです。SOLIDの原理に従わないクラス(特に依存性注入)の部分的な嘲笑

また、私のコードを単体テストするために、クラスXの "getGen()"をオーバーライドするのはいかがですか?または私のコードはテスト不能ですか?

テストクラスA:

class A { 
    public Type method(Typ1 a) { 
     //do something 
     X x = new X(a, String a); 
     x.doSmething(); 
     //do something? 
    } 
} 

クラスX:

final class X extends Y { 
    Typ1 t; 
    String x; 
    X(Typ1 t, String x) { 
    this.t = t; 
    this.x = x; 
    } 
    public void doSomething() { 
     int x = getGen().method(x); 
     //do something 
    } 
} 

抽象クラスY:

abstract class Y { 
    Obj getGen(){ 
    return someInstanceOfObj; 
    } 
} 

のOBJクラス:

class Obj { 
    int method(){ 
    return someNumber; 
    } 
} 
+0

x.somethingは()voidを返す場合なぜ内部の行動を嘲笑したいのですか?クラスAをテストするつもりであれば、Xの内部構造は無関係です。たぶんクラスXとそのdoSomethins()メソッドの動作を実際にテストしたいのですか? –

答えて

1

ほとんどすべての可視性修飾子が省略されているので、すべてがpackage private except doSomething() `であると仮定します。 (あなたはクラスXからfinalキーワードを削除する必要が原因)は、クラスYとテストクラスと同じパッケージにunittestのその場合の代わりに

X

@Test 
public void doSomething_delegatesToObj(){ 
    // arrange 
    X x = Mockito.spy(new X()); 
    Obj o = mock(Obj.class); 
    doReturn(o).when((Y)x).getObj(); // must be in same package as Y for this. 

    // act 
    x.doSomething(); 

    // assert 
    verify(o).method(/*not sure what belongs here*/); 
} 
関連する問題