2016-08-04 21 views
1
public class A { 
    public static B b = new B(); 
} 

public B{ 
    public void method(Interface arg){} 
} 

public C { 
    public void method2 (Object arg2){ 

    InterfaceInstance d = new InterfaceInstance; 
    A.b.method(d); 
    } 
} 

A.b.method()がクラスCのメソッドmethod2()で実行されているかどうかをテストします。 私はどうすれば偽装できますか?ありがとう。ビューの静的フィールドのvoidメソッドをモックする方法はありますか?

答えて

3

異なるポイント:

静的は良いオブジェクト指向設計では異常です。メソッドを呼び出す静的なフィールドを考え出すのは、非常に良い理由があるはずです。 PowerMock(ito)を使用してテストを受けるよう強制するためです。

So:「大きな」PowerMockハンマーに切り替えるのではなく、どうにかしてテスト困難なコードをテストできるようにする。足踏みをしてデザインを改善することを検討してください!

意味:staticは、クラス間の直接的な低レベル結合を作成します。それはあなたが本当に "実世界"のアプリケーションのために避けたいものです。

+0

もし私がコードを修正できたら、私はここでそれを聞いていません – wmmj23

+0

@ wmmj23あなたは何度何回反対を聞いたのでしょうか。その場合、kuhajeyanの答えはおそらくより多くのお手伝いをします。 – GhostCat

2

それはこのようにすることができ、

PowerMockito.mockStatic(A.class); 
ArgumentCaptor<Object> captor = ArgumentCaptor.forClass(Object.class); 
PowerMockito.doNothing().when(
       A.class, "method", captor.capture());//mock static 

C c = new C(); 
c.method2(new String("Mock")); 

PowerMockito.verifyStatic(times(1)); 
Object obj = captor.getValue();//if you want check the object passed 
+0

org.powermock.reflect.exceptions.MethodNotFoundException:パラメータタイプでメソッドが見つかりません – wmmj23

+0

私のコードを変更しました。メソッドargはインタフェースとして設計されています。しかし、方法2では、インタフェースのインスタンスが作成されています。 ArgumentCaptor.forClassでinterface.classを使用することはできません – wmmj23

0

あなたはあなたの問題を解決するには2つの方法がありますので、静的な初期化を抑制し、私はこのケースでの使用に好む、クラス私として

  • Mock constructor
  • のSuppress static initialisation

    • をそれは私にもっとコントロールを与える。

      @RunWith(PowerMockRunner.class) 
      @PrepareForTest(A.class) 
      @SuppressStaticInitializationFor("classapackage.A") 
      public class Test{ 
          @Mock 
          private B bMock; 
      
          @Before 
          public void setUp(){ 
           // if A.b public 
           A.b = bMock 
           // if b private 
           org.powermock.reflect.Whitebox.setInternalState(A.class,"b", bMock); 
          } 
      } 
      

      私はコードをチェックしていません。どのように問題を解決できるかは一般的な考えです。

    関連する問題