2016-05-25 7 views
2

私はJUnitを使用してテストケースを作成しています。テスト対象メソッドはプライベートコンストラクタをパラメータとして持つ最終クラスをとります。 newのキーワードでインスタンス化できないため、Mockitoを試してみましたが、Mockitofinal classが嫌いです。私はPowerMockitoを使用しましたが、それは私には妥当だと思われましたが、PowerMockito.mockStatic(Field.class);はvoidメソッドであり、メソッドを呼び出すときに引数として渡すことができるように、Fieldの参照が必要です。Java/Mockito/PowerMockitoを使用してプライベートコンストラクタでクラスをインスタンス化

私はIllegalArgumentExceptionをキャッチしたいが、最初に私はどのように確認していないテスト

public boolean accept(Field field) { 
    if(ignoreNulls) { 
     try { 
      if(field.get(super.getObject()) == null) { 
       return false; 
      } 
     } catch (IllegalArgumentException e) { 
     } catch (IllegalAccessException e) { 
     } 
    } 

    return super.accept(field); 
} 

JUnitテストケース

@Test(expected=IllegalArgumentException.class) 
    public void testAccept() throws Exception { 
     DefaultToStringBuilder builder = new DefaultToStringBuilder(new Object()); 
     PowerMockito.mockStatic(Field.class); 

     builder.accept(?); 
} 

下の引数

方法としてFieldの参照を渡す必要があります私はこれをしなければなりません。事前

+0

あなたは既にhttp://stackoverflow.com/questions/2599440/how-can-i-access-a-private-constructor-of-a-classをチェックしましたか? – EagleRainbow

答えて

3

おかげで私たちは、実際にこれを達成するためにCore Javaを使用することができます。下のコードは、それを行う方法を示しています。

private Field field; 
    @Test(expected=IllegalArgumentException.class) 
    public void testAccept() throws Exception { 
    Class<?> clazz = Field.class; 
    Constructor<?> [] constructors = clazz.getDeclaredConstructors(); 

    for(Constructor cons: constructors) { 
     cons.setAccessible(true); 
     field = (Field) cons.newInstance(); 
    } 

    DefaultToStringBuilder builder = new DefaultToStringBuilder(new Object()); 
    builder.accept(field); 

    assertNotNull(builder); 
} 
+0

あまりにも多くのトラブルなしで働いてくれてありがとう –

2

私の答えことをしません。プロダクションコードを他の方法でテストできないため、PowerMockに参加しないでください。

PowerMockでは、解決するよりも多くの問題が生じることがあります。

通常、PowerMockを使用する必要があるのは、壊れた設計に由来します。そのため、PowerMockによるテストのために壊れた設計を可能にするために時間を費やす代わりに、設計を再設計するためにその時間のほんの一部を費やしたほうがよいでしょう。 (そして私の経験から、PowerMockはすぐに無駄な時間を費やすことにつながります)

意味:テスト目的でパッケージ保護されたコンストラクタを追加することができます。または、一歩一歩進んでより広い画像を得ることもできます。公共のコンストラクタを可能にする方法を見つける。現在の最終的/私的な実装に至る設計思想を維持しています。

+0

それは正しいJagermeisterです。 PowerMockを使うのは好きではありませんが、状況に合うかもしれませんが。より簡単にテストできるようにデザインをやり直す方がよいでしょう。 –

関連する問題