Java Mockito在同一导航集上给出无限while循环和有限for循环 我在JUnit测试中使用了Mockito。我模仿了一个NavigableSet 在我的单元测试中,我需要循环到这个NavigableSet中包含的对象中 出于测试目的,我计划此NavigableSet,只包含一个对象

Java Mockito在同一导航集上给出无限while循环和有限for循环 我在JUnit测试中使用了Mockito。我模仿了一个NavigableSet 在我的单元测试中,我需要循环到这个NavigableSet中包含的对象中 出于测试目的,我计划此NavigableSet,只包含一个对象,java,loops,junit,mockito,Java,Loops,Junit,Mockito,以下是我与Mockito一起用于创建模拟对象的代码: NavigableSet<ObjectToProcess> newMockedSet = new TreeSet<ObjectToProcess>(); ObjectToProcess mockedInnerObject = new ObjectToProcess(); // initialization of this object newMockedSet.add(mockedInnerObject); // I

以下是我与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);
为什么下面的
for
循环只按预期循环一次

NavigableSet<ObjectToProcess> anotherSetOfObjects = getSetOfObjectToProcess(); // retrieving the mocked object
for (ObjectToProcess thisMockedInnerObject : anotherSetOfObjects)
{
    ObjectToProcess thisPaymentDemand = thisMockedInnerObject;
    // do stuff
}
navigablestanothersetofobjects=getSetOfObjectToProcess();//检索模拟对象
for(对象处理此MockedInner对象:另一组对象)
{
ObjectToProcess thisPaymentDemand=thisMockedInnerObject;
//做事
}

这不是Mockito问题

while示例中,您在每次迭代的循环开始时调用另一组对象.iterator()

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

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

Iterator<NavigableSet> iterator = anotherSetOfObjects.iterator();
while (iterator.hasNext())
{
    ObjectToProcess thisPaymentDemand = anotherSetOfObjects.iterator().next();
    // do stuff
}
Iterator Iterator=另一组对象。Iterator();
while(iterator.hasNext())
{
ObjectToProcess thisPaymentDemand=另一组对象。迭代器().next();
//做事
}

这样做将使while循环像for循环一样工作。

这不是Mockito问题

while示例中,您在每次迭代的循环开始时调用另一组对象.iterator()

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

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

Iterator<NavigableSet> iterator = anotherSetOfObjects.iterator();
while (iterator.hasNext())
{
    ObjectToProcess thisPaymentDemand = anotherSetOfObjects.iterator().next();
    // do stuff
}
Iterator Iterator=另一组对象。Iterator();
while(iterator.hasNext())
{
ObjectToProcess thisPaymentDemand=另一组对象。迭代器().next();
//做事
}

这样做将使while循环像for循环一样工作。

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

// 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) {
... 
//设置测试夹具
MyCollaborator x=Mockito.mock(MyCollaborator.class);
当(x.getSetOfObjectToProcess())。然后返回(newMockedSet);
//然后在以后的测试中
NavigableSet anotherSetOfObjects=x.getSetOfObjectToProcess();
while(另一组对象.迭代器()…){
//或
for(对象处理此MockedInner对象:另一组对象){
... 
因此,您缺少
when()
参数的
x.
部分

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


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

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

// 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) {
... 
//设置测试夹具
MyCollaborator x=Mockito.mock(MyCollaborator.class);
当(x.getSetOfObjectToProcess())。然后返回(newMockedSet);
//然后在以后的测试中
NavigableSet anotherSetOfObjects=x.getSetOfObjectToProcess();
while(另一组对象.迭代器()…){
//或
for(对象处理此MockedInner对象:另一组对象){
... 
因此,您缺少
when()
参数的
x.
部分

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

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