これは少し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
で、最後はメソッド本体でインスタンス化されています。実際のContentValues
オブジェクトへContentValues
が、代表者すべてとまったく同じ機能を提供し、私はContentValuesWrapper
を作った最初の問題を解決するために
。 2番目の問題については、ContentValuesWrapper
のインスタンスを提供する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;
}
}
。
あなたのクラスをラップでこれを使用することができます
https://github.com/jayway/powermock/wiki/MockFinalモックパワーを見てください〜120ms私はそれを使用するたびに。 'ContentValues'はデータベーストランザクションによく使用されるので、' ContentValues'が使われるたびにPowerMockを使って複数のテストクラスのテスト時間を増やす必要があります。 –