2016-09-28 10 views
0

は、私はいくつかの静的メンバ Powermock - あざける静的クラスメンバー

public class ClientFact { 

    private static final String BASE_URL = Config.getProperty("prop1"); 
    private static final String USERID = Config.getProperty("prop2"); 

    ...................... 

    public static Client createClient() throws AppException { 

    } 

} 

が含まれている以下のクラスをモックしようとしているが、私はConfig.getPropertyによって作成される静的メンバ変数の問題に実行していますよ。このクラスは、プロパティの読み取りはそう

public class Config { 

............... 

    public static String getProperty(Param param) { 
     String value = null; 
     if (param != null) { 
     value = properties.getProperty(param.toString()); 
     } 
     return value; 
    } 
} 

私は私のテストでロードされたプロパティに気をいけないので、私はこの呼び出しを模擬しようとしているようなファイルありません。これは、IVEが

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ClientFact.class}) 

public class MyTests { 


    @Test 
    public void test() { 

     PowerMock.mockStaticPartial(Config.class, "getProperty"); 
EasyMock.expect(Config.getProperty(EasyMock.anyObject())).andReturn(EasyMock.anyString()).anyTimes(); 

    PowerMock.mockStatic(ClientFact.class); 

    } 


} 

が、その次のエラーを与えて...

java.lang.NoSuchMethodError: org/easymock/internal/MocksControl.createMock(Ljava/lang/Class;[Ljava/lang/reflect/Method;)Ljava/lang/Object; 
    at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2214) 
    at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163) 

ここで間違ってdoign何イム任意のアイデアを試してみました何ですか?

+0

あなたの依存関係を矛盾するバージョンのように聞こえます。 –

答えて

1

非答え:そこ静的通話を発信しないことを検討してください。

あなたは、その直接のカップルを見ている他のいくつかのクラスではその静的メソッドの実装に一つのクラス。本当の理由はありません。 (およびレコードの:それは、USER_ID文字列があなたのClientFactクラスの静的フィールドであることを奇妙に思えるあなたが本当にすべてClientFactsが同じUSER_ID ?!使用していることを意図しています。)あなたはその静的に取って代わる可能性が

を非静的なバージョンで呼び出す(例えば、インターフェイスを導入するなど)。 依存性注入を使用して、テスト中のクラスでそのインタフェースのインスタンスを使用できるようにすることができます。そして、あなたのテストはすべてせずに動作し、Powermockする必要があります。

かいつまん:(!常にではないが)非常に頻繁にPowermockにオンにする必要が(あなたのケースのように)テスト可能であることを書かれていなかった製品コードに由来します。したがって、大きな問題のPowermockハンマーを使用してテスト問題を「修正」する代わりに、実動コードを改善することを検討する必要があります。

あなたは私が何を言っているか理解を得るために、これらのvideosを聞きたいかもしれません。

+0

リンクに感謝しています。そのレガシーコード:) ...その間、私はそれに固執しています...そう、intefaceのアイデアで、私は新しい実装でConfigクラスを作成し、createClientに渡します....それは何を意味するのでしょうか? – blu10

+0

はい。しかし、もちろん、もしあなたがそのコードを変更できない(あるいはしたくない)なら、Powermockは実行可能な選択肢です。あなたが必要とすることをするためにそれを得ることができるはずです。その場合、いくつかの検索を行うことをお勧めします。例を調べる;-) – GhostCat

関連する問題