2017-06-27 22 views
0

抽象クラスを継承するクラスのテストを書く必要があります。 superの参照を持つメソッドをテストする必要があるときに問題が発生します。コードは次のようになります。抽象クラスを継承するテストクラス

public abstract class AbstractClass{ 
    public String someMethod(); 
} 

public class MyClass extends AbstractClass { 
    methodToTest(){ 
     //somecode 
     super.someMethod(); 
    } 
} 

どのように考えたらいいですか?

EDIT: 私は残念ながら、私は単体テストにはまだ慣れていませんが、ちょうど一瞬前に、これがうまく動作しない理由を理解しました。上記の例のMyClassには、実際にsomeMethodで使用されるAbstractClassで宣言されたいくつかのフィールドを設定する初期化ブロックが含まれています。new AbstractClass.someMethod()は私にsuper.someMethodと同じ結果を与えませんでした。そして、私はAbstractClassを初期化できないので、望ましい結果を得ることは不可能です。私は何とかそれを模擬する必要があると考えましたが、私が言ったように私はこれに新しいですし、持っている。ここ

public abstract class AbstractClass{ 
    String fieldA; 
    public String someMethod(){ 
     //does something with fieldA 
    } 
} 

public class MyClass extends AbstractClass { 
    { 
     setFieldA("something"); 
    } 
    methodToTest(){ 
     //some code 
     super.someMethod(); 
     //returns some string based on the fieldA value 
    } 
} 

UPDATEは私のコードのバージョンを更新していることを行う方法がないアイデア。そのための筆記試験で私を助けてください。私はおそらくそこからそれを得ることができるでしょう:

public abstract class AbstractClass{ 
    String fieldA; 
    public String someMethod(){ 
     fieldA = "String" + fieldA; 
    } 
} 

public class MyClass extends AbstractClass { 
    { 
     setFieldA("Another String"); 
    } 
    methodToTest(){ 
     fieldA = fieldA + "Yet Another String"; 
     super.someMethod(); 
     return fieldA; 
    } 
} 
+0

いいえ、問題の正確な内容を説明していないためです。テスト中のクラスが別のメソッドを呼び出すと、なぜ問題になるのですか?このメソッドが抽象基本クラスから実際に継承されることが重要なのはなぜですか?より良い例を提供することを検討し、[mcve]の枠を囲んでください。 – GhostCat

+0

編集済み投稿です。それは今はっきりしていますか?私は本当にこの1つで助けていただければ幸いです。 – Arkadeusz91

+0

さて、これで十分です.-) – GhostCat

答えて

0

あなたの問題はユニットテストについてはあまりありません。抽象クラスでの作業の一般的な誤解があります。

まず、あなたの抽象クラスで作業を行うフィールドが必要な場合は、ではなく、でセッターを使用してください。代わりに:つまり

public abstract class Base { 
    private final String thatField; 
    public Base(String incoming) { 
    thatField = incoming; 
    } 
.. 

public class Derived extends Base { 
    public Derived(String incoming) { 
    super(incoming); 
    } 

:このフィールドは、あなたのクラスの重要一部であるようです。だから明示してください。そして、コンストラクタを介して設定することを可能にすることにより、あなたはまた、あなたが/どのようにフィールドが

  • に設定されますときに、コンパイラからの助けを得る制御

    • ことを確認してください - ときに、フィールドの決勝を行うことによって、あなたはエラーを取得します初期化を忘れる

    それ以上:いくつかのクラスのテストを開始するときに、そのクラスが単にObjectを拡張するかどうかは関係ありません。または他のクラスを拡張している場合。抽象クラスを拡張しても

    これは、ここで言えることです。実際のコードが "本当に"何をしているかについての具体的な詳細は、あなたの例には含まれていないという事実を考慮してください。

  • +0

    残念ながら、このコードは実際には動作しない限り変更できないレガシーコードです。したがって、コードをリファクタリングしてテストを書くことはできません。だから私は私のクラスを簡略化したバージョンで私の投稿を更新しようとしています。 – Arkadeusz91

    +1

    私はそれを手配することができます:P – Arkadeusz91

    関連する問題