2016-07-05 10 views
2

私のクラス構造があるMockito Javaでメソッドを継承した。その後モックは、次のように

public class MyParentClass { 

void doSomethingParent(){ 
    System.out.println("something in parent"); 
} 
} 

public class MyClass extends MyParentClass{ 


    protected String createDummyRequest(Holder myHolder){ 
     //... 
     super.doSomethingParent();//I want to avoid this 
     //... 
     callingDB(); 
     return "processedOutput"; 
    } 

    private void callingDB(){ 
     System.out.println("Calling to DB"); 
    } 
} 

私のユニットテスト:私は私の中で)super.doSomethingParent(の呼び出しを防ぐにはどうすればよい

public class UnitTest { 


    public void testCreateDummyRequest(){ 
     //create my mock holder 
     Holder mockHolder = new Holder(); 

     MyClass mockObj = Mockito.mock(MyClass.class); 
     //mock doSomethingParent() 
     //mock callingDB() 

     //as mockObj is a fully mock, but I need to run my real method 
     //Mockito.when(mockObj.createDummyRequest(mockHolder)).thenCallRealMethod(); 
     mockObj.createDummyRequest(mockHolder); 
     //Problem: doSomethingParent() is getting called though I have mocked it 
    } 
} 

方法? (私がテストを書いている方法)

+0

NicktarとSerghey Bishyrの回答はすでにあなたにとって役に立つかもしれないと思いますが、私はもう少しコメントがあるかもしれません。 UnitTestクラスの目標は、MyClassの実装をテストするだけですが、MyParentClassからの依存関係を解除することです(言い換えれば、MyParentClassのモックを提供するMyClass実装をテストします)。 –

答えて

2

このクラス構造では、模擬テストは本当に難しいです。可能であれば、霧のように模擬してテストすることが難しいクラス構造を伸ばして維持することも同様に困難であるため、構造を変更するようアドバイスします。

あなたがに似たものに、あなたのクラス構造を変えることができるのであれば:

public class MyClass { 

    private DoSomethingProvider doSomethingProvider; 

    private DbConnector dbConnector; 

    public MyClass (DoSomethingProvider p, DbConnector c) { 
     doSomethingProvicer = p; 
     dbConnector = c; 
    } 


    protected String createDummyRequest(Holder myHolder){ 
     //... 
     doSomethingProvider.doSomethingParent(); 
     //... 
     dbConnector.callingDB(); 
     return "processedOutput"; 
    } 
} 

することができますなら、あなたは簡単に.... DoSomethingProviderとDbConnectorと出来上がりのモックと

をあなたのインスタンスを作成することができますクラス構造を変更しないと、Mockito.mockの代わりにMockito.spyを使用して、特定のメソッド呼び出しをスタブし、実際のオブジェクトを使用する必要があります。

public void testCreateDummyRequest(){ 
    //create my mock holder 
    Holder mockHolder = new Holder(); 

    MyClass mockObj = Mockito.spy(new MyClass()); 

    Mockito.doNothing().when(mockObj).doSomething(); 

    mockObj.createDummyRequest(mockHolder); 
} 

注:superキーワードを使用するには、そのメソッドの呼び出しをスタブからMockitoを防ぐことができます。スーパーへの呼び出しをスタブする方法があるかどうかはわかりません。可能であれば(クラス内の親メソッドをオーバーライドしなかった場合など)、キーワードを削除してください。

2

私は同様の問題に直面したので、私はspy()を使用してhepldできることを確認します。

public class UnitTest { 

    private MyClass myObj; 

    @Before 
    public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
    myObj= spy(new MyClass()); 
    } 

    @Test 
    public void mockedSuperClassMethod(){ 
    doNothing().when((MyParentClass)myObj).doSomethingParent(); 
    //... 
    } 
} 

このアプローチは私には役に立ちます。

+0

また、doSomethingParent()がスーパークラスの** final **でないことを確認してください。そうしないと、Mockitoはそれをモックできません。 –