4

EasyMock を使用していくつかの junit テスト ケースを作成しています。これまでのところ、POJO を返すことを期待しているクラスについては理にかなっていますが、それ自体が例外をスローする可能性のある DAO オブジェクトをどのように処理すればよいでしょうか。私のテスト ケースは、DAO で問題が発生したときにスローされる予想される例外をチェックすることです。EasyMock を使用して、DAO オブジェクト (fooクラスからのテスト) をモックしてみます。下位レベルの DAO 例外を処理する正しい方法は何ですか。

クラス/単純な呼び出しの例を以下に示します: (すべてのゲッター/セッター/コンストラクターが有効で存在すると仮定します)

public class foo{
    private daoClass dao = daoClass.getInstance();
    public String getValueFromDB(String key) throws DBException{
        return dao.lookup(key);
    }
}

public class daoClass{ //singleton DAO 
    public daoClass getInstance(){
       //singleton access here
    }
    public String lookup(String key) throws DBException{
        try{
            //DB LOGIC
        }
        catch(Exception e){
            throw new DBException(e.getMessage());
        }
    }
}

クラスをテストしようとするときfoo、この DBException をテストできるようにしたいと考えています。これをどのように処理すればよいですか? (テストで) try/catch で DAO 呼び出しを回避するか、テストにスローを追加する必要がありますか? それがスローされた場合、テストに合格することはわかってexpected=DBExceptionいますが、構文的にどのように内部例外を処理する必要がありますか?

テストコードの例:

@Test(expected=DBException.class)
public void testFooError(){
    String key = "test";
    String value = "expected";
    daoClass daoMock = createMock(daoClass.class);
    try{
        expect(daoMock.lookup(key)).andReturn(value);
    } catch (DBException e){
        // ???
    }
}

expectがエラーをスローする可能性がある場合の正しい処理方法は何ですか? テスト メソッドthrowを例外にする必要がありますか、それともtry/catch使用する必要がありますか? expected=EXCEPTIONテストでタグを使用することはまだ正しいですか?

4

2 に答える 2

7

単体テストで例外を処理する方法は次のとおりです。

例外を明示的にテストしていない場合は、メソッドに throws 句を追加する必要があります。例外がスローされ、例外がスローされることを予期していなかった場合、それはテストの失敗です。例えば、

@Test
public void testFooNormal() throws DBException{
    String key = "test";
    String value = "expected";
    daoClass daoMock = createMock(daoClass.class);
    expect(daoMock.lookup(key)).andReturn(value);
    // do an assert on returned value
    ...
}

例外を明示的にテストしている場合、それがスローされると予想される行の周りに try-catch を配置し (予想される例外の最も狭いバージョンをキャッチします)、catch 句にブール値を設定すると、アサートがオンになるはずです。ブール値。例えば、

@Test
public void testFooError(){
    String key = "test";
    String value = "expected";
    boolean exceptionThrown = false;
    daoClass daoMock = createMock(daoClass.class);
    try{
      expect(daoMock.lookup(key)).andReturn(value);
    }catch (DBException e) {
      exceptionThrown = true;
    }
    // assert exceptionThrown is true
    ...
}

これは、正しい例外がスローされることだけでなく、予期した行から正確にスローされることもテストしていることを意味するため、例外をテストするのに適した方法です。@test(expected=...) を使用すると、テストの別の行でその例外がスローされ、テストが誤ってパスする可能性があります。

于 2013-03-01T16:51:58.977 に答える
3

テストに基づいて DAO ロジックを変更しないでください。DAO が例外をスローすることを期待している場合は、そのままにして、テストしている方法で例外をテストします。

ロールバックやロギングなどを行うために DAO 自体で例外をキャッチしている場合、テスト ケースはテスト ケース シナリオではないため、例外を期待すべきではありません。この場合、DAOが NULL を返すと予想されるため、 NULL を確認できます。

于 2013-03-01T16:41:10.050 に答える