【问题标题】:How can I pass mock object in data provider, using Mockito TestNG?如何使用 Mockito TestNG 在数据提供者中传递模拟对象?
【发布时间】:2015-10-05 15:12:34
【问题描述】:

我正在尝试通过数据提供者将模拟对象传递给测试方法。下面是我的测试类:

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

【问题讨论】:

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


    【解决方案1】:

    Testng 正在按以下特定顺序调用方法:serviceData、beforeMethod 和 m1。

    如果你想通过数据提供者传递一个模拟,你必须在数据提供者方法之前或之中创建它。

    【讨论】:

    • 谢谢!转移 MockitoAnnotations.initMocks(this);到 serviceData 解决了。
    【解决方案2】:

    您也可以使用@BeforeTest 方法,即在@DataProvider 方法之前运行。由于之前执行了@BeforeTest@DataProvider 方法可以使用模拟。

    @BeforeTest 不能与@BeforeMethod 混淆。见What is the difference between BeforeTest and BeforeMethod in TestNG

    【讨论】:

    • @boltup_im_coding 你能澄清什么是不正确的吗?它至少适用于 testng-6.9.12.jar。如果我在“@BeforeTest”中初始化模拟,我可以通过“@DataProvider”返回它。
    • @boltup_im_coding 取消投票怎么样? :) 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多