2016-09-30 5 views
1

testB1Method2ServiceクラスB1のオーバーライドされたメソッドa1Method2をモックしてテストしたいと思います。私はクラスA1B1で何も変更したくありません。私はmockito 1.9.0とpowermockito 1.4.12を使用しています。私がしようとしています次のコード:mockito powermokitoを使用したモックオーバーライドメソッド

UnitTestServiceクラス:

import static org.mockito.Mockito.*; 

import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.mockito.MockitoAnnotations; 
import org.powermock.api.mockito.PowerMockito; 
import org.testng.Assert; 
import org.testng.annotations.Test; 

public class UnitTestService { 

    @Mock 
    B1 b1; 
    @InjectMocks 
    Service service = new Service(); 

    @Test 
    public void testB1Method2() throws Exception { 
     MockitoAnnotations.initMocks(this); 
     when(b1.a1Method2()).thenReturn("mockvalue"); 
     PowerMockito.whenNew(B1.class).withArguments(Mockito.any()).thenReturn(b1); 
     String output = service.serviceMethod(); 
     System.out.println("=====" + output); 
     Assert.assertTrue("mockvalue".equalsIgnoreCase(output), "testA1Method2 failed!"); 
    } 

} 

サービスクラス:

public class Service { 

    public String serviceMethod() { 
     B1 b1 = new B1("some data"); 
     return b1.a1Method2(); 
    } 

} 

クラスA1:

public abstract class A1 { 

    public A1(String data) { 
     //doing many thing with data 
    } 

    public String a1Method1() { 
     return "from a1Method1"; 
    } 

    public String a1Method2() { 
     return "from a1Method2"; 
    } 

} 

B1クラス:

public class B1 extends A1 { 

    public B1(String data) { 
     super(data); 
    } 

    @Override 
    public String a1Method1() { 
     return "a1Method1 from B1 class"; 
    } 

} 

eclipseでtestNGを使用してクラスUnitTestServiceを実行しています。そして、クラスBの実際のメソッドは、コンソールの "a1Method2から" =====を印刷しているので呼び出されています。つまり、ここでは、mockitoはこのメソッドを擬似することができないようです。

UnitTestServiceクラスのコードを変更して、どのようなコードを変更すればよいですか?B1 a1Method2

+1

[PowerMockito.whenNew()を使用しても嘲笑されず、元のメソッドが呼び出される可能性があります](http://stackoverflow.com/questions/25317804/using-powermockito-whennew-is-not-getting-mocked- and-original-method-is-called) – Magnilex

答えて

0

コードをテストするのが難しいというコードを作成しました。これはまったく理由がありません。 サービスクラスにnew B1という小さな電話があります。

依存性注入をそのオブジェクトに使用する場合は、あなたは絶対にpowermockに対処し、継承されたメソッドを嘲笑する必要はありません。それであなたは単に "モック" B1を作ることができます。それをあなたのサービスに渡してください。あなたはフルあなたのテスト中に起こっていることを制御している。

ここで実行可能な代替案は、テストするのが簡単になるようにプロダクションコードを改善するだけで、複雑なテストのセットアップを回避することです。

私が話していることをよりよく理解するために、それらを見てください。videos

+0

サービスメソッドで新しいオブジェクトを作成すべきではありませんか? –

+0

私は言っている:あなたが**新しい**を使用すると、(簡単!)あなたのオブジェクトを制御する能力が緩んでいる。したがって、* new * **への呼び出しを避けることでコードをより良くすることができます。言ったように:A)約**依存性注射**を読んで、B)そのビデオを見る;少なくとも最初のものは... – GhostCat

関連する問題