這有點針對Android,但它可以適用於非Android項目。正在實例化最終unmockable類的單元測試方法
我有這個類將FilterEntity
映射到ContentValues
。 FilterEntity
是我創建和控制的數據結構,而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
複製功能的更好的方法。
我使用PowerMock,但我想,因爲它通過增加單元測試時間儘量少使用它〜我每次使用它120毫秒。 'ContentValues'在數據庫事務中非常常見,因此每次使用'ContentValues'時都必須使用PowerMock來增加多個測試類的測試時間。 –