2012-02-23 10 views
5

こんにちは私は簡単な問題で苦労しています。JUnit同じオブジェクト内の他のメソッドを使用するテストメソッド

一般的な考え方:

class Foo(){ 
    public boolean method1(); 
    public String method2(); 
    public String method3(); 
    public String shortcut(){ 
    return (method1() == true) ? method2() : method3(); 
    } 
} 

どのように私はショートカットメソッドをテストする必要がありますか?

私は他のオブジェクトを使用するオブジェクトとテストメソッドを模擬する方法を知っています。サンプル:

class Car{ 
    public boolean start(){}; 
    public boolean stop(){}; 
    public boolean drive(int km){}; 
} 
class CarAutoPilot(){ 
    public boolean hasGotExternalDevicesAttached(){ 
    //Hardware specific func and api calls 
    //check if gps is available 
    //check if speaker is on 
    //check if display is on 
    } 
    public boolean drive(Car car, int km){ 
    //drive 
    boolean found = hasGotExternalDevicesAttached(); 
    boolean start = c.start(); 
    boolean drive = c.drive(km); 
    boolean stop = c.stop(); 
    return (found && start && drive && stop) == true; 
    } 
} 

class CarAutoPilotTest(){ 
    @Test 
    public void shouldDriveTenKm(){ 
    Car carMock = EasyMock.Create(Car.class); 
    EasyMock.expect(carMock.start()).andReturns(true); 
    EasyMock.expect(carMock.drive()).andReturns(true); 
    EasyMock.expect(carMock.stop()).andReturns(true); 
    EasyMock.reply(carMock);  

    CarAutoPilot cap = new CarAutoPilot(); 
    boolean result = cap.drive(cap,10); 
    Assert.assertTrue(result); 
    EasyMock.verify(carMock); 
    } 
} 

しかし、hasGotExternalDevicesAttached()メソッドはどうですか?これは実際のシナリオではないサンプルです。私はどのようにドライブ方法をテストすべきですか? hasGotExternalDevicesAttached関数をモックする必要がありますか?

テスト中のクラスをモックできますか?

+0

+1「どのようにドライブメソッドをテストすればよいですか? Punnyもの。 –

答えて

3

CarAutoPilotのサブクラスを作成して、hasGotExternalDevicesAttached()をオーバーライドし、このサブクラスのインスタンスでテストを実行できます。

あなたはインラインそれを行うことができます:あなたはCarAutoPilotの行動の残りのための有効なユニットテストを作成することができます

CarAutoPilot cap = new CarAutoPilot() { 
    public boolean hasGotExternalDevicesAttached(){ 
     // return true or false depending on what you want to test 
    } 
}; 

この道を。

あなたが望むのであれば、これは貧しい人の部分模擬と呼ぶことができます。

+0

とても簡単です:)ありがとう! – kuki1384

3

それぞれのメソッドに対して1つのテストを作成します。複雑さを減らすと、テストする方がはるかに簡単です。

これらは一つのテストそれぞれ持っている必要があります。それはあなたの他のメソッドを呼び出しますので、最後のメソッドをテストする必要はありません

public boolean method1(); 
    public String method2(); 
    public String method3(); 

を、どのようにこれまで、その方法が変更された場合(イムは、その唯一のサンプルコードを推測以来、 )、それにはより多くの論理があります。そのためにも、1つのテスト方法が必要です。

hasGotExternalDevicesAttached()に関しては、テストできないすべての外部呼び出しに対してmockerを作成する必要があります。

テスト中のスキルを向上させる場合は、The Art of Unit Testingを読むことをお勧めします。これは私の意見では、初心者が単体テストの芸術を学び勉強するのに最適な本です。

+0

+1:私は非常に同意します! – carlspring

+0

私はいつも外部呼び出しをモックしようとしていますが、いくつかのブール変数をチェックして状態を返す単純なパブリックメソッドがあるかもしれません。このメソッドは、同じオブジェクト内の他のパブリックメソッドで使用されます。上記のようにこのメソッドをオーバーライドすれば十分です。しかし私はあなたの答えにも同意します。本のお薦めをありがとう。それも参考になりました。 – kuki1384

1

はい、EasyMock Class Extensionライブラリを使用できます。 documentation of EasyMockで「部分的な嘲笑」を探します。

アイデアは、オブジェクトのメソッドのうちの1つ(またはいくつか)だけをモックし、モックされたメソッドに依存するメソッドをテストすることです。

関連する問題