2016-05-10 3 views
0

これは少しAndroid仕様ですが、Android以外のプロジェクトにも適用できます。最後のunmockableクラスをインスタンス化するユニットテストメソッド

私はFilterEntityContentValuesにマッピングするこのクラスを持っています。 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; 
     } 
    } 

答えて

0

は、私がPowerMockを使用するのですが、私はそれがでユニットテスト時間が増加するので、難できるだけそれを使用しようとしていますたぶんあなたの代わりに

+0

あなたのクラスをラップでこれを使用することができます

https://github.com/jayway/powermock/wiki/MockFinalモックパワーを見てください〜120ms私はそれを使用するたびに。 'ContentValues'はデータベーストランザクションによく使用されるので、' ContentValues'が使われるたびにPowerMockを使って複数のテストクラスのテスト時間を増やす必要があります。 –

関連する問題