2017-09-07 19 views
0

powerMockまたはEasyMockだけを使って別のクラスで使われているクラスを模擬する方法はありますか?私はこの2つのフレームワークしか使えません。私はMockitoを使うことができますが、コードベースにはeasymockとpowermockライブラリのみがあります。フレームワークのみ。模擬テスト中のクラスで使用されている別のクラスを模倣しますか?

は、私が)(SecondClass.getVoidCallメソッドをモックとしたい(私はpowerMockを使用しています)

public class ClassUnderTest { 

    public void getRecord() { 
     System.out.println("1: In getRecord \n"); 
     System.out.println("\n 3:"+SecondClass.getVoidCall()); 
     System.out.println("\n 4: In getRecord over \n"); 
    } 
} 

コードの下に持っています。

public class ArpitSecondClass { 


    public static int getVoidCall() { 
     System.out.println("\n 2: In ArpitSecondClass getVoidCall for kv testing\n"); 
     return 10; 
    } 
} 

私のユニットテストコードは

@RunWith(PowerMockRunner.class) 
@PrepareForTest(TestArpit.class) 
public class UniteTestClass { 

    @Test 
    public void testMock() throws Exception { 
     SecondClass class2 = createMock(SecondClass.class); 
     expect(class2.getVoidCall()).andReturn(20).atLeastOnce(); 
     expectLastCall().anyTimes(); 

     ClassUnderTest a=new ClassUnderTest(); 
     a.getRecord(); 
     replayAll(); 
     PowerMock.verify(); 
} 

} 

基本的に私は

1: In getRecord 

2: In ArpitSecondClass getVoidCall for kv testing 

3:20 (Note:This should be overriden by the value I supplied in UnitTest) 

4: In getRecord over 

以下のような出力をしたいしかし、私はUnitestコードを取得しています出力は

2: In ArpitSecondClass getVoidCall for kv testing 
です

コードフローdoes not go b (class2.getVoidCall())。andReturn(20).atLeastOnce();

getRecordの残りのステートメントは、一度も呼び出されないので印刷されません。

ここに何か不足していますか?

+0

静的メソッドを使用しては悪い習慣です柔軟性がなく、再利用するのが難しいコード。したがって、あなたに悪いデザインを渡して* PowerMock *を使う代わりに、 'ArpitSecondClass'のメソッドから' static'キーワードを削除し、このクラスのインスタンスをコンストラクタパラメータとしてテスト対象のクラスに渡すべきです。 –

答えて

3

SecondClass#getVoidCall()public static int getVoidCall() {...})の方法は、staticの方法であり、そのように嘲笑は少し異なります。

置き換え最初の2行:

@Test 
public void testMock() throws Exception { 
    SecondClass class2 = createMock(SecondClass.class); 
    expect(class2.getVoidCall()).andReturn(20).atLeastOnce(); 
以下の線で

(および準備クラス):それはクラスの依存関係を隠し、あなたになりますので、

import static org.easymock.EasyMock.expect; 
import static org.powermock.api.easymock.PowerMock.mockStatic; 
... 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({TestArpit.class, SecondClass.class})  // added SecondClass.class here 
public class UniteTestClass { 

    @Test 
    public void testMock() throws Exception { 
     mockStatic(SecondClass.class);         // changed this line 
     expect(SecondClass.getVoidCall()).andReturn(20).atLeastOnce(); // changed this line 
+0

安心して働きました。ありがとうございます –

関連する問題