2015-10-05 5 views
5

データプロバイダを通じてメソッドをテストするためにmockオブジェクトを渡そうとしています。以下は私のテストクラスである:私はこれを実行するとMockito TestNGを使用して、データプロバイダに模擬オブジェクトを渡すにはどうすればよいですか?

@Test 
public class FirstTest { 
@InjectMocks 
First firstSpy; 

@Mock 
Second secondMock; 

@Mock 
Third thirdMock; 

@BeforeMethod 
public void beforeMethod() { 
    firstSpy = Mockito.spy(new First()); 
    MockitoAnnotations.initMocks(this); 

} 

@DataProvider 
private final Object[][] serviceData() { 
    return new Object [][] { 
     {thirdMock, 1}, 
     {null, 2} 
    }; 
} 

@Test(dataProvider="serviceData") 
public void m1(Third thirdObject, int noOfTimesm3Called) { 
    Mockito.doReturn(secondMock).when(firstSpy).m4(); 
    Mockito.doReturn(thirdObject).when(secondMock).m2(); 
    firstSpy.m1(); 
    verify(firstSpy, times(noOfTimesm3Called)).m3(); 
} 
} 

しかし、それはヌルオブジェクトが渡された両方の時間を意味

PASSED: m1(null, 2) 
FAILED: m1(null, 1) 

を表示します。これの背後にある理由は何ですか?そして、私はどのようにして望ましい行動を取ることができますか?私は、テストメソッドでif-elseステートメントを避け、データプロバイダを使用して同じメソッドで両方のケースをテストしたいと考えています。それのための方法はありますか?

答えて

1

Testngは、serviceData、beforeMethod、およびm1という特定の順序でメソッドを呼び出しています。

データプロバイダでモックを渡す場合は、データプロバイダメソッドの前またはその中に作成する必要があります。

+0

ありがとうございます! MockitoAnnotations.initMocksをシフトする(this); serviceDataに解決しました。 – Caesar

0

@BeforeTestメソッドを使用することもできます。これは@DataProviderメソッドの前に実行されます。

関連する問題