2017-01-10 7 views
1

だから私は、コンストラクタを持ってテストするためのクラスを持っている -パワーMockito WhenNew does'nt仕事

public class IdRunnable{ 
    public IdRunnable(Node root) { 
      this.saHandler = new Handler(root); 
    } 

    public void call(){ 
    //Somes codes 
    } 
} 

私はnew演算子が呼び出されたときにモックオブジェクトを注入するPowermockフレームワークを使用しています。テストクラスは -

@RunWith(PowerMockRunner.class) 
@PrepareForTest({IdRunnable.class,Handler.class}) 
public class IdRunnableTest { 
    private IdRunnable runnable; 

    @BeforeClass 
    public void oneTimeSetUp(){ 
     Node root = new Node(); 
     Handler handler = mock(Handler.class); 
     whenNew(Handler.class).withArguments(root).thenReturn(handler); 
     runnable = new IdRunnable(root); 
    } 

    @Test(groups = {TestGroup.UNIT_TESTS}) 
    public void testCall(){ 
     runnable.call(); 
    } 
} 

私が代わりにそれは本当のハンドラ・オブジェクトを作成するに行くIdRunnableのコンストラクタで新しいステートメントをからかっていることがわかりますテストを実行すると。 どういうわけかコード

whenNew(Handler.class).withArguments(root).thenReturn(handler); 

は私にとっては機能しません。コードに何が間違っているのか誰にでも示唆することができます。

ありがとうございました。

+0

matcherを変更すると動作します: 'whenNew(Handler.class).withArguments(Mockito.any(Node.class))。then return(handler);'? – troig

答えて

1

もちろん可能です。しかしそのようなエネルギーの浪費。

ちょうど行います

public IdRunnable(Node root) { 
    this(new Handler(root); 
} 

IdRunnable(Handler saHandler) { 
    this.saHandler = saHandler; 
} 

とPowerMockに回すためにあなたの "必要性" はちょうど消えます。はい、いいえが必要です PowerMockは良いことです。今は、あなたがモックする必要があるそのオブジェクトを注入することができるコンストラクタを使うことができるからです。

これは、テスト可能なコードを書くことを好みます。私の経験では:;それは簡単にどのように学習することにより、回避することができ

    1. Powermockは時々(全く量産コードのバグに根ざしていない、このようなあいまいな問題と突然のすべてを失敗したテストケースなど)醜い驚きを提供していますtestableコードを作成します。

    編集:あなたのコメントがありました。あなたの唯一の選択肢はPowerMock(ito)をあなたのために働かせることです。おそらくこれは私のanswerに役立ちます。これには、コンストラクタ呼び出しをモックするための小さな例が含まれています。あなたのニーズにそれを適応させるのは大したことではありません。

  • +0

    提案していただきありがとうございます。しかし、これは私が取り組んでいるレガシーコードなので、既存のコードをリファクタリングすることはできません。コードベースをリファクタリングせずにどのようにこれを達成できるかについての考え方 – Tapan

    +0

    あまりにも悪いです。それでも、私は答えにあなたのための更新を入れました。 – GhostCat

    +0

    Thanks Ghost ... testng注釈@BeforeClassと@Test(groups = {TestGroup.UNIT_TESTS})をjunit注釈に置き換えたときの動作です。 Powermockをtestngと互換性を持たせる方法 – Tapan

    関連する問題