4

JUnitで単体テストを作成していますが、SQLExceptionをキャッチしてnullオブジェクトを返す特定のメソッドのブランチを正常にカバーできませんでした。これは私がテストしているクラスです:

@Component
public class UnitOfMeasureRowMapper implements RowMapper<UnitOfMeasure> {
    public UnitOfMeasure mapRow(final ResultSet resultSet, final int rowNumber) throws SQLException {
        UnitOfMeasure unitOfMeasure = new UnitOfMeasure();
        try {
            unitOfMeasure.setUnitOfMeasureId(resultSet.getInt("UNITOFMEASUREID"));
            unitOfMeasure.setOwnerUserId(resultSet.getInt("USERID"));
            unitOfMeasure.setName(resultSet.getString("NAME"));
            unitOfMeasure.setDescription(resultSet.getString("DESCRIPTION"));
        } catch (SQLException e) {
            unitOfMeasure = null;
        }
        return unitOfMeasure;
    }
}

これは、上記のメソッドの2番目のブランチをカバーするために作成したJUnitテストです(テストクラスからの適切なコンテキストを使用)。

private static UnitOfMeasure testUnitOfMeasure;
    private static UnitOfMeasureRowMapper mockRowMapper;

    public void setUp() throws Exception {
        mockRowMapper = mock(UnitOfMeasureRowMapper.class);
        mockResultSet = mock(ResultSet.class);
    }
    @Test(expected=SQLException.class)
    public void testUnitOfMeasureRowMapperFailsSQLException() throws SQLException {

        when(mockRowMapper.mapRow(mockResultSet, 1)).thenReturn(null);
        testUnitOfMeasure = mockRowMapper.mapRow(mockResultSet, 1);
    }

問題は最後の行にあると思います。どういうわけか、SQLExceptionを強制する必要があります。問題は、方法がわからず、答えを見つけることができなかったことです。誰か助けてもらえますか?

4

2 に答える 2

4

質問をよく理解していれば、テスト対象のクラスはUnitOfMeasureRowMapperです。これが true の場合、テストでそれをモックしたくありません。そうでない場合は、モックをテストしています! JUnit でテストされているのは、メソッドの実行中にResultSetが SQLException をスローしたときのUnitOfMeasureRowMapper#mapRowの動作です。次に、このメソッドが null を返すようにします。私は次のように書きます:

private ResultSet mockResultSet;
private RowMapper<UnitOfMeasure> rowMapper = new UnitOfMeasureRowMapper();

public void setUp() throws Exception {
    mockResultSet = mock(ResultSet.class);
}
@Test
public void mapRow_SHOULD_return_null_WHEN_resultSet_throws_a_SQLException() {
    when(mockResultSet.getInt(anyString()).thenThrow(new SQLException());
    assertThat(mockRowMapper.mapRow(mockResultSet, 1), nullValue());
}

サミュエルの回答で示唆されているように、SQLException をスローするために使用する結果セットのメソッドの 1 つを設定し、mapRow メソッドが期待どおりに null を返すことを JUnit でチェックすることができます。ここでは、結果セットの動作をテストしていないため、結果セットをモックして、別の方法で取得するのが困難な状況下で通常の動作を実現することは問題ありません。結果セットの動作をモックすることで、RowMapper の動作のテストに集中できます。

RowMapperを実装するUnitOfMeasureRowMapperをテストしています。したがって、JUnit にrowMapperプロパティを用意してください。私は、そのインターフェイスを介して表示することを好みます。JUnit をできる限りシンプルに保ちたいので、 UnitOfMeasureRowMapperのコンストラクターを残酷に呼び出すのが好きです。

于 2012-09-29T09:18:19.363 に答える
0

モックのメソッドの 1 つ (おそらくgetInt?) を設定ResultSetして、例外をスローします。使用しているモッキング フレームワークを指定していないため、正確な構文はわかりません。

于 2012-09-29T01:06:42.510 に答える