2016-05-10 48 views
0

這有點針對Android,但它可以適用於非Android項目。正在實例化最終unmockable類的單元測試方法

我有這個類將FilterEntity映射到ContentValuesFilterEntity是我創建和控制的數據結構,而ContentValues是Android SDK的最後一個類,如果未被模擬,它將拋出RuntimeException

public class FilterEntityToContentValuesMapper { 

    public ContentValues mapOrThrow(FilterEntity filter) { 
     final ContentValues values = new ContentValues(); 

     values.put(FilterSchema.COLUMN_ID, filter.id().toString()); 
     values.put(FilterSchema.COLUMN_NAME, filter.name()); 
     // and others... 

     return values; 
    } 
} 

測試時ContentValues#put會立即拋出RuntimeException,因爲它不是嘲笑,但問題是它不能被嘲笑的原因有兩個。第一個ContentValues是final,第二個是在方法體中實例化的。

爲了解決第一個問題,我做了一個ContentValuesWrapper它提供了完全相同的功能ContentValues但代表一切,一個真正的ContentValues對象。對於第二個問題,我提供了一個ContentValuesWrapperFactory,它提供了ContentValuesWrapper的實例。最終的結果是,像這樣:

public class FilterEntityToContentValuesMapper { 

    private final ContentValuesWrapperFactory contentValuesWrapperFactory; 

    public FilterEntityToContentValuesMapper(ContentValuesWrapperFactory contentValuesWrapperFactory) { 
     this.contentValuesWrapperFactory = contentValuesWrapperFactory; 
    }   

     public ContentValues mapOrThrow(FilterEntity filter) { 
      final ContentValuesWrapper values = contentValuesWrapperFactory.createContentValuesWrapper(); 

      values.put(FilterSchema.COLUMN_ID, filter.id().toString()); 
      values.put(FilterSchema.COLUMN_NAME, filter.name()); 
      // and others... 

      return values; 
     } 
    } 

我想知道如果有解決這個問題,因爲我有ContentValuesWrapper複製功能的更好的方法。

回答

0

看一看功率模擬https://github.com/jayway/powermock/wiki/MockFinal

也許你可以使用,而不是包裹你的類此

+0

我使用PowerMock,但我想,因爲它通過增加單元測試時間儘量少使用它〜我每次使用它120毫秒。 'ContentValues'在數據庫事務中非常常見,因此每次使用'ContentValues'時都必須使用PowerMock來增加多個測試類的測試時間。 –

相關問題