1
  • 我在JUnit 测试中使用Mockito。我嘲笑了一个.NavigableSet
  • 在我的单元测试中,我需要循环到 this 中包含的对象NavigableSet
  • NavigableSet出于测试目的,我计划仅包含 1 个对象。

以下是我使用 Mockito 创建模拟对象的代码:

NavigableSet<ObjectToProcess> newMockedSet = new TreeSet<ObjectToProcess>();
ObjectToProcess mockedInnerObject = new ObjectToProcess(); // initialization of this object
newMockedSet.add(mockedInnerObject); // I just added the only 1 object contained in the NavigableSet
Mockito.when(getSetOfObjectToProcess()).thenReturn(newMockedSet);

为什么下面的while循环给出了一个NavigableSet只包含 1 个对象的无限循环?

NavigableSet<ObjectToProcess> anotherSetOfObjects = getSetOfObjectToProcess(); // retrieving the mocked object
while (anotherSetOfObjects.iterator().hasNext())
{
    ObjectToProcess thisPaymentDemand = anotherSetOfObjects.iterator().next();
    // do stuff
}

为什么以下for循环的行为与预期一样只循环一次?

NavigableSet<ObjectToProcess> anotherSetOfObjects = getSetOfObjectToProcess(); // retrieving the mocked object
for (ObjectToProcess thisMockedInnerObject : anotherSetOfObjects)
{
    ObjectToProcess thisPaymentDemand = thisMockedInnerObject;
    // do stuff
}
4

2 回答 2

3

这不是 Mockito 问题。

while示例中,您在每次迭代anotherSetOfObjects.iterator()的循环开始时调用。

您将获得一个迭代器(对于包含单个项目的 mockedSet),然后检查它是否具有下一个(确实如此),然后进入循环体。主体完成后,您将再次运行条件检查以查看是否循环...通过获取一个NEW迭代器,其功能与第一个迭代器完全相同(假设您同时没有修改集合) .

将迭代器存储在循环之外,以便在每次迭代时测试相同的迭代器,而不是获取新的迭代器:

Iterator<NavigableSet> iterator = anotherSetOfObjects.iterator();
while (iterator.hasNext())
{
    ObjectToProcess thisPaymentDemand = anotherSetOfObjects.iterator().next();
    // do stuff
}

这样做会使你的 while 循环表现得像你的 for 循环一样。

于 2013-02-13T19:12:26.707 回答
1

从发布的代码中很难理解您的意图。您需要演示某个协作类类型的模拟对象的创建以及您正在测试的类的身份。此外,when()调用的参数应该是 Mockito 模拟上的方法调用的形式。换句话说,

// setting up test fixture
MyCollaborator x = Mockito.mock(MyCollaborator.class);
when(x.getSetOfObjectToProcess()).thenReturn(newMockedSet);

// and then later in test
NavigableSet<ObjectToProcess> anotherSetOfObjects = x.getSetOfObjectToProcess();
while(anotherSetOfObjects.iterator() ...) {

// or
for (ObjectToProcess thisMockedInnerObject : anotherSetOfObjects) {
... 

所以你错过了论点的x.一部分。when()

不太清楚的是你的意图是什么。如果您尝试getSetOfObjectToProcess()在某个类上测试该方法,那么您不应该嘲笑该类。您应该只模拟与您正在测试的类(通常称为“被测系统”或 SUT)交互的协作者类/对象。

您的代码甚至没有显示使用Mockito.mock()方法或@Mock注释创建 Mockito 模拟对象,并且至少其中一个是使用 Mockito 所必需的。如果getSetOfObjectToProcess()是静态方法,那么 Mockito 无论如何都不会为您模拟它。

于 2013-02-13T19:14:28.753 回答