2016-08-15 40 views
3

私はMockitoを初めて使っています。 私はデシベル相互作用をあざけることにより、サービスのjnuitを記述しようとしています:Mockitoを使ったモック内部メソッド

私はクラス(実際のクラスの単なる代表)

public class TestService{ 

    public Response getTestList(String type){ 
     list = getListbyType(type); 

     return response.entity(list); 
    } 

    private List getListbyType(String type){ 
      ... 
      .. 
      TestDAO testdao = new Testdao(sqlconn); 
      list = testdao.getListfromDB(type) 
      return list; 
    } 
} 

を以下していると私のテストクラスは

public class TestServiceTest{ 

    @InjectMocks 
    private TestService testService = new TestService(); 
    @Test 
    public void getTestListTest(){ 

     List testlist = new List(); 
     tetslist.add("test1"); 

     TestDAO testdaomock = mock(TestDAO); 
     when(testdaomock.getListfromDB("test")).thenreturn(list); 

     list = testService.getTestList(test); 
    } 
} 
のようなものです

しかし、私はこのテストを実行すると、まだ実際のDB呼び出しを呼び出し、SQL接続と非デフォルトのコンストラクタを擬似すると、擬似値ではなくdbから値を取得しますか?私は無知です。

- UPDATE

人々が示唆したように、私は私のサービスのコンストラクタにDAOのインスタンスを移動してもスパイを使用し、しかし、まだ、私の実際のDBの呼び出しではなく、モックの呼び出しで呼び出されます。

+0

'' private List getListbyType(String type) 'がprivateであるため、' testdaomock.getListfromDB( "test") 'はコンパイルしないでください。どのようにコンパイルするのですか? – Arkadiy

+0

getListbyType(String型)はprivateですが、testdaomock.getList fromDB( "test")は公開されているDAOクラスにあります – user1933888

+0

'@RunWith(MockitoJUnitRunner.class) ' – WildDev

答えて

2

あなたの問題は、次のステートメントである:

TestDAO testdao = new Testdao(sqlconn); 

あなたが(モックから得たTestDAOのインスタンス)あなたは、成功した模擬するためにnew

を次のtestdao.getListfromDB(type)に使用されるインスタンスではありません依存関係の逆転を適用する必要があります。つまり、newは、単純化されたファクトリやSpring設定ファイルなど、テストしたくないクラスにのみ表示する必要があります。

[更新]

適切IOCがオプションでない場合、あなたはそれをDAOを割り当て、spy()方法を紹介することができます。この方法はパッケージプライベートでなければなりません。これはhereと記載されています。

別のオプションは、引数としてtestdaoをとり、そのコンストラクタの条件でデフォルトコンストラクタを表現するパッケージプライベートコンストラクタを追加することです。

+0

は理にかなっていますが、現在IOCを導入することはできません。デフォルトのものではなく、このparametarizedコンストラクタを模擬する方法がありますか? – user1933888

+0

PowerMockを使用することもできますが、別のjunitランナーを使用する必要があります。https://github.com/jayway/powermock/wiki/MockitoUsage#how-to-mock-construction-of-new-objects – sandrozbinden

+1

'TestDAO'を' TestService'に変換するには 'getTestList'メソッドの' TestDAO'インスタンスへの参照を渡します。別の方法は、 'TestService'に' TestDAO'属性を追加し、デフォルト値を設定します。 'TestDAO'属性を設定する' TestService'にセッターを追加してください。そして、あなたはテストでこのセッターを使って 'TestDAO'モックを渡すことができます。 – Poger

2

TestServiceクラス(レガシーコード)を変更できない場合は、PowerMockito(https://github.com/jayway/powermock)で新しいインスタンスをモックする可能性があります。これはバイトコードの操作を可能にする独自のjunitランナー(PowerMockRunner)を使用します。ここで

あなたのコードの例:あなたはあなたのdependciesにpowermock-API-mockitoとpowermockモジュール-junit4を追加する必要があります

import static org.mockito.Matchers.anyString; 
import static org.mockito.Mockito.when; 
import org.mockito.Mock; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
public class TestServiceTest { 

    @Mock 
    TestDAO testDaoMock; 

    @Test 
    public void test() throws Exception { 
    List<String> testlist = new ArrayList<>(); 
    testlist.add("test1"); 
    when(testDaoMock.getListfromDB(anyString())).thenReturn(testlist); 
    PowerMockito.whenNew(TestDAO.class).withAnyArguments().thenReturn(testDaoMock); 
    TestService testService = new TestService(); 
    Response actualResponse = testService.getTestList("testType"); 
    assertEquals(expectedResponse, actualResponse); 
    } 
} 

関連する問題