2016-12-02 8 views
1

私はJavaクラスAを持っています。Aのコンストラクタは、いくつかのメソッドm1、m2を呼び出します。メソッド内のメソッドをテストする最善の方法は何ですか? (JUnit)

class A{ 

    public A(){ 
     m1(); 
     m2(); 
    ...... } 

    public void m1(){...}; 
    public void m2(){...}; 
} 

これらのメソッドのテストを書くにはどうすればよいですか?私は一般的にそれらを書いています

class TestClass{ 

static A a = null; 

public TestClass(){ 
    a = new A(); 
} 

@Test 
public testm1(){ 
    A.m1(); 
    //Some logic 
} 

しかし、これらの関数はコンストラクタ自体で呼び出されます。メソッドを2回実行してチェックしているように見えますが、メソッドが正しく記述されていないと、コンストラクター自体が失敗します。それをテストする正しい方法は何ですか?

+2

重要:メソッドをテストしないで、動作をテストしてください – JonK

+0

他にも役立ちます:内部(特に非静的)クラスは避けてください。 eclipseでは、内部クラス名にカーソルを置き、 "Alt + Shift + T"を押し、 "V"を押すことでそれを行います。そうすれば、あなたの内なる階級を外側に動かすことができます。そこでは、あなたが望む方法をテストすることができます。特に、アウトターAクラスを模擬することができます –

答えて

5

まず、あなたのインターフェイスは奇妙に見えます。

他のパブリックメソッドを呼び出す1つのパブリックメソッドを持つことにはあまり意味がありません。だから、実際のの問題は、あなたが記述したものとまったく同じです。つまり、コンストラクタがそのm1とm2メソッドを呼び出すということです。

コンストラクタはこれらのメソッドを呼び出すか、理想的にはプライベートである必要があります。またはそれらは公開されていますが、それを呼び出すのはコンストラクタの責任ではありません。

その意味では、答えは一歩前進してデザインのこの側面を注意深く見ていることです。可能であれば、それを変更してください!

いずれにしても:あなたの現在のデザインを維持するとき。他の方法はありませんが、そのようなものを複数回テストすることです。。あなたは、あなたのコンストラクタが(m1()、m2()、m3()のどれかを呼び出しているかどうかに関わらず、あなたのコンストラクタが動作しているかどうかをテストする必要があります。クラスの既存のインスタンス上のすべてのパブリックメソッドを呼び出すことも確実に行う必要があります。

最後に:「存在する」ためにメソッドを呼び出さないでください。各メソッドは明確な目的(別名契約)を持っている必要があります。それらの契約が確実に守られるようにテストケースを作成します。

+0

m1、m2をパブリックにすると、完全なコンストラクターを一度にテストすることを除いて、個々の関数をテストする方法はありません。私はこれがコンストラクタがinitializeVariables()などのような多くの関数を呼び出すかもしれないところで何度も来る一般的なケースだと思います。それらをどのようにテストしますか? – Sashank

+0

もう一度:問題は:あなたのコンストラクタはおそらく** public **メソッドを呼び出さないでください。なぜあなたは "initializeVariables"のようなものを** public **メソッドとしたいのですか?後で呼び出すことができます...再び! – GhostCat

関連する問題