catch
実際、これはコードカバレッジ用であり、ステートメントをカバーするのに苦労しています。何か案は?
例えば:
私のselectSomethingBySomething()
メソッド(dbから選択)にSQLException
、実際のソースコードに実際に触れることなく、テストメソッドでかなり難しいメソッドをスローさせたいです。WHERE
また、私が制御できるのは句のパラメーターであるという制約もあります。
catch
実際、これはコードカバレッジ用であり、ステートメントをカバーするのに苦労しています。何か案は?
例えば:
私のselectSomethingBySomething()
メソッド(dbから選択)にSQLException
、実際のソースコードに実際に触れることなく、テストメソッドでかなり難しいメソッドをスローさせたいです。WHERE
また、私が制御できるのは句のパラメーターであるという制約もあります。
selectSomethingBySomething()
最初にを含むクラスをモックしてから、この動作を記録する必要があります。モッキートでは、次のように言います。
SomeDao someDaoMock = mock(SomeDao.class);
willThrow(new SQLException())).given(someDaoMock).selectSomethingBySomething();
someDaoMock
次に、テスト対象のクラスに注入し、それが呼び出されると、someDaoMock.selectSomethingBySomething()
以前に選択された例外がスローされます。
EasyMockを使用すると、クラスとその特定のクラスのメソッド呼び出しをモックできます。
例えば:
DoSomethingDAOがClassNameの場合、
DoSomethingDAOmockDAOのようにクラスをモックします
EasyMock.createMock(DoSomethingDAO.class);
これで、このmockDAOから行われているすべての呼び出しをモックする必要があります。
メソッドが値を返す場合は、以下のように呼び出しをモックする必要があります。
EasyMock.expect(mockDAO.selectSomethingBySomething()).andReturn(EasyMock.anyObject());
メソッドが例外をスローした場合、以下はメソッド呼び出しです
EasyMock.expect(mockDAO.selectSomethingBySomething()).andThrow(new (typeofExecption));
voidメソッドの場合
mockDAO.selectSomethingBySomething();
EasyMock.expectLastCall().atleastOnce();
それを行う方法はたくさんありますが、私のアドバイスは100%のコードカバレッジを目指すことではありません。それは単にそれだけの価値はありません。あなたはごくわずかな利益のためにあなた自身の人生を困難にしています。
ただし、本当にテストしたい場合は、コードを変更してテストしやすくするのがおそらく最善の方法です。データアクセスクラスにインターフェイスを実装させてから、モックフレームワーク(JMockなど)を使用してモックアウトし、SQLExceptionをスローします。(具体的なクラスをモックすることはできますが、それは嫌われています。)
実際には、トリックを実行するために追加のフレームワークは必要ありません。方法は次のとおりです。
Exception hasToBeThrown = null;
try {
methodThatShouldThrow();
} catch (Exception e) {
assertTrue(e.getMessage().startsWith("if you want to...")); // JUnit will miss this, if not thrown, so we need more
hasToBeThrown = e;
}
assertNotNull(hasToBeThrown); // but this will do