2012-09-29 89 views
3

我正在JUnit中編寫單元測試,但未能成功覆蓋捕獲SQLException並返回空對象的特定方法的分支。 這是我測試的類:如何在JUnit中強制實施SQLException

@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; 
    } 
} 

這是我寫以覆蓋上述方法的第二分支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。問題是,我不知道如何也無法找到答案。誰能幫忙?

回答

3

如果我很好地理解了這個問題,那麼被測試的類是UnitOfMeasureRowMapper。如果這是真的,那麼你不想在你的測試中嘲笑它,否則你正在測試一個模擬! 你的JUnit中正在測試什麼,是的行爲UnitOfMeasureRowMapper#mapRowResultSet你給它拋出一個SQLException方法執行過程中。然後你想要這個方法返回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,然後檢查你的JUnit的方法之一,該mapRow方法按預期返回null。在這裏,你沒有測試結果集的行爲,因此可以嘲笑它來實現它通常在某些情況下會有的行爲,否則將會非常痛苦。模擬結果集行爲可讓您專注於測試RowMapper行爲。

您正在測試的UnitOfMeasureRowMapper實現的RowMapper。因此,在你的JUnit中有一個rowmapper屬性,我更喜歡通過它的接口來看它。我喜歡粗暴地調用UnitOfMeasureRowMapper的構造函數,因爲我想讓我的JUnit儘可能簡單。

+1

原來這整個時間我只需要使用thenThrow。我一直在努力讓自己的工作與Return合作。謝謝! –

0

設置您的模擬ResultSet的方法之一(可能getInt?)拋出異常。你沒有指定你正在使用的模擬框架,所以我不能告訴你確切的語法。

+0

他正在使用Mockito。 – Alban

+0

@塞繆爾埃德溫沃德和阿爾班:謝謝,很好。我正在使用mockito,而且我應該指定它。此外,我一直在研究其他一些編碼,並且一直無法回到這一點。希望不久我會回到你身邊,讓你知道什麼工作。謝謝! –