2012-05-09 7 views
4

私が持っているクラスの単体テストを書いています。このクラスにはパブリックメソッドがあり、パブリックメソッドの内部には同じクラスのプライベートメソッドが呼び出されます。私はそれらのプライベートメソッドへの呼び出しを嘲笑したい。このクラスは次のようなものです:パブリックメソッドでPowerMock、Mockito、およびTestNGで使用されているプラ​​イベートメソッドをモックします。

public class SomeClass { 
    public int somePublicMethod(int num) { 
     int num2 = somePrivateMethod1(num); 
     int num3 = somePrivateMethod2(num); 

     return num2 + num3; 
    } 

    private int somePrivateMethod1(int num) { 
     return 2*num; 
    } 

    private int somePrivateMethod2(int num) { 
     return 3*num; 
    } 
} 

私のユニットテストでは、私はPowerMockをMockitoとTestNGで使用しようとしています。私はオンラインのいくつかの例を見てきました

FAILED: testSomePublicMethod 
org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 
-> at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:31) 

E.g. thenReturn() may be missing. 
Examples of correct stubbing: 
    when(mock.isOk()).thenReturn(true); 
    when(mock.isOk()).thenThrow(exception); 
    doThrow(exception).when(mock).someVoidMethod(); 
Hints: 
1. missing thenReturn() 
2. you are trying to stub a final method, you naughty developer! 

が、私は避難所」:私はこのテストを実行すると、私は例外といくつかのヒントを得る

import static org.powermock.api.mockito.PowerMockito.doReturn; 
import static org.powermock.api.mockito.PowerMockito.spy; 

import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.testng.Assert; 
import org.testng.annotations.Test; 

@PrepareForTest(SomeClass.class) 
public class SomeClassTest { 

    @Test 
    public void testSomePublicMethod() throws Exception { 
     int num = 4;   

     SomeClass someClassSpy = spy(new SomeClass()); 

     doReturn(8).when(someClassSpy, "somePrivateMethod1", num); 
     doReturn(12).when(someClassSpy, "somePrivateMethod2", num); 

     int result = someClassSpy.somePublicMethod(num); 

     Assert.assertEquals(result, 20); 
    } 
} 

:ここsomePublicMethodを試験する試験での私の試みはありますPowerMockを使ってMockitoとTestNGを使用して、私が望むことを具体的に行うことができました。誰かが私に何か異なることができるかについてのいくつかの指針を私に与えることができますか?

答えて

0

ここでは、あなたはMockitoの制限を嫌うと思います。同様のケースでは、私はPowermockのメソッドの置き換えを使用するか、テストされたクラスインスタンスを構築するときにターゲットメソッドをprotectedとして宣言し、オーバーライドします。 希望に役立ちます。

1

このようにすることはできません。反射を使用しようとしましたか?

リフレクションを使用することにより、あなたがinvokeメソッドをからかっ、または単純でプライベートメソッドを模擬することができます:あなたは、(多分ティアダウン中)試験後、公共一時的に変更することができます - あなたはプライベートに戻ってそれを変更することができます。

このヘルプが必要です。

5

これはPowerMockの問題ではないと思います。そのままでうまくいくはずです。 TestNGがPowerMockとやり取りする際に問題があるのだろうか?

私はTestNGの経験がないので、JUnitでクラスを実行しようとしました。

import static org.powermock.api.mockito.PowerMockito.*; 

import org.junit.Assert; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(SomeClass.class) 
public class SomeClassTest { 

    @Test 
    public void testSomePublicMethod() throws Exception { 
     final int num = 4; 

     final SomeClass someClassSpy = spy(new SomeClass()); 

     doReturn(8).when(someClassSpy, "somePrivateMethod1", num); 
     doReturn(12).when(someClassSpy, "somePrivateMethod2", num); 

     final int result = someClassSpy.somePublicMethod(num); 

     Assert.assertEquals(result, 20); 
    } 
} 

テストパス:SomeClassSomeClassTestが最小限のJUnitを使用するように変更し、そのまま放置しました。

PowerMockRunner.classは、@RunWIthなどのJUnitのアノテーションを使用して指定する必要がありますか?その注釈を削除すると、投稿したのと同じエラーメッセージが表示されます。

EDIT:このリンクによると

http://code.google.com/p/powermock/wiki/TestNG_usage

あなたはPowerMockオブジェクトファクトリを使用するようにTestNGのを指示する必要があります。

@ObjectFactory 
public IObjectFactory getObjectFactory() { 
    return new org.powermock.modules.testng.PowerMockObjectFactory(); 
} 

か、またPowerMockTestCaseから拡張することができます安全のために:プログラムでこれを行うには、あなたのテストクラスには、このようなメソッドを追加し

@PrepareForTest(SomeClass.class) 
public class SomeClassTest extends PowerMockTestCase { 
    //... 
} 
関連する問題