如何使用Mockito TestNG在数据提供程序中传递模拟对象?

时间:2015-10-05 15:12:35

标签: java unit-testing testng mockito testng-dataprovider

我试图通过数据提供程序将模拟对象传递给测试方法。以下是我的测试课程:

@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语句,并希望使用数据提供程序在同一方法中测试这两种情况。有办法吗?

2 个答案:

答案 0 :(得分:2)

您还可以使用在'0'方法之前运行的case 0: ... case 1: ... 方法。由于@BeforeTest之前执行过,@DataProvider方法可以使用模拟。

@BeforeTest不要与@DataProvider混淆。请参阅What is the difference between BeforeTest and BeforeMethod in TestNG

答案 1 :(得分:1)

Testng以此特定顺序调用方法:serviceData,beforeMethod和m1。

如果要使用数据提供程序传递模拟,则必须在数据提供程序方法之前或之前创建它。