2017-08-03 15 views
1

私は貧弱なデザインの結果である奇妙な状況を抱えていますが、その事実を受け入れる必要があります。問題は、ビルドマシンに存在しないローカルファイルを見つけようとすると、問題のあるメソッドが副作用を起こしているため、mockingで問題が発生することです。(Power)Mockitoでクラスの初期化でプライベート静的メソッドの静的呼び出しをモックする方法はありますか?

それはこのようなものです:MockitoまたはPowerMockitoは、任意のモックを行う前にある)、現時点では私はそれが本当のloadProperties(呼び出し、テストクラスの内部クラスを言及ので、私はこれを模擬するために問題を抱えている

class BadDesignedClass { 
    public static final Properies = loadProperties(); 
    private static Properties loadProperties() { 
     // ... loads non-existent property file and crashes... 
    } 
} 

、エラーがスローされます。

答えて

1

クラスを初期化せずにロードします(詳細はthis answerにあります)。その後、loadPropertiesは呼び出されません。これはで達成することができます。

Class<?> clazz = Thread.currentThread().getContextClassLoader() 
    .loadClass("org.example.BadDesignedClass"); 

次に、clazzをPowerMockitoに渡すことができます。完全なソリューションを持っている

0

、私はSpaceTruckerのアドバイスに触発され、私は正確に何をしたかここに紹介します:

まず:初期化せずにクラスをロードします。

Class<?> clazz = Thread.currentThread().getContextClassLoader() 
     .loadClass("org.example.BadDesignedClass"); 

Second:すべての問題を引き起こしていた静的メソッドを抑制します。

PowerMockito.suppress(PowerMockito.method(clazz , "loadProperties")); 

サードloadProperties()は現在抑制されているので、いつものようにクラスをモックを続けます。

PowerMockito.mockStatic(BadDesignedClass.class); 
PowerMockito.when(BadDesignedClass.someMethod()).thenReturn("something"); 
関連する問題