当前位置: 首页 > 知识库问答 >
问题:

如何使用Mockito正确模拟每个循环?

白子默
2023-03-14

我想测试我的方法,我需要模拟项目和行的向量来遍历它们中的每一个。

我准备了一个结果向量,当我从Item类(在测试中)调用getRows()时,我总是希望得到它。

问题是测试中getRows方法的结果总是空的,所以这意味着doReturn语句在这里不能正常工作。

我做错了什么吗?

class MyServiceTest {
@Mock
private Item mockedItem;

@Mock
private Row mockedRow;

@InjectMocks
@Spy
private MyService myService;

@Test
public void testMyMethod() {
    Vector<Row> rows = new Vector<Row>();
    Row row = new Row();
    rows.add(row);

    doReturn(rows).when(mockedItem).getRows();

    ...
    //some code to test the service

    }
}

class MyService {
    protected SomeObject myMethod(Vector<Item> items) {     
        for(Item item : items) {
            for(Row row : item.getRows()) {
               //cannot get here while debugging the test

               //some code
            }
        }
    ...
    }
}
class Item {
...
    public Vector<Row> getRows(){
       //return some vector of rows
    }
}

共有1个答案

袁博
2023-03-14

< code>@InjectMock是无用的,因为被模仿的向量是被测试方法的一个参数,而不是被测试类的一个字段。< br >所以您不需要注入任何东西。< br >

您需要做的是创建一个Item的< code>Vector,其中每个元素都是一个mock,具有< code>getRows()的预期行为:返回存根行。< br >

下面是一个示例代码:

// create stubbed rows
Vector<Row> rows = new Vector<Row>();
Row row = new Row();
rows.add(row);

// mock items Vector
Vector<Item> items = new Vector<>();
for (...){ // nb element to create
  Item mockedItem = Mockito.mock(Item.class);
  doReturn(rows).when(mockedItem).getRows();
  items.add(mockedItem);
}

然后通过传递向量来调用测试的方法:

new MyService().myMethod(items);

请注意,Vector是一个旧的、有缺陷的集合
如果您不需要处理竞争条件,则将ListArrayList作为实现

 类似资料:
  • org.mockito.exceptions.misusing.invaliduseofmatchersexception:在此处检测到错误的参数匹配器:->at service.activity.service.activitesServiceTest.setup(activitesServiceTest.java:45) 不能在验证或短截之外使用参数匹配器。参数匹配器的正确用法示例:when(

  • 我的测试存根是 我在这里做错了什么?

  • 我想通过ts-Mockito@2.5.0创建一个类的模拟对象,但我无法正确设置它。 以下是设计的测试用例: 正如测试用例所暗示的,我希望从我的模拟中返回“I AM mocked”的值。 我应该如何设置模拟,使其按预期工作? 旁白:这个测试用例只是为了展示我正在经历的奇怪行为。这不是我真正的测试。我想在不同服务的单元测试中使用模拟。)

  • 我尝试测试一个发送jms消息的类,但无法模拟JmsTemplate JmsProducer.class: JmsProducerTest。类别: 当我运行这个测试用例时,它给了我:java。lang.IllegalArgumentException:对象不是声明类的实例 你对这个问题有什么想法吗?

  • 问题内容: 我有一个建设者: 在模仿器中模拟生成器将使我对每种方法都无效。因此,有没有一种简单的方法可以使生成器在每次调用函数时返回自身,而无需使用来模拟每个函数本身。 问题答案: 您可以使用RETURN_DEEP_STUBS模拟链接API。 如果您知道将调用您的构建器的确切顺序,那么以下是如何使用它的示例: 不幸的是,这不会为您提供一种模拟“所有各种生成器方法”的通用方法,以使它们始终返回此值,

  • 问题内容: 如何用void返回类型模拟方法? 我实现了一个观察者模式,但是我无法用Mockito对其进行模拟,因为我不知道如何做。 我试图在互联网上找到一个例子,但没有成功。 我的课看起来像这样: 系统不会通过模拟触发。 我想显示上述系统状态。并根据他们做出断言。 问题答案: 看看Mockito API文档。由于链接的文档提到(点#12),你可以使用任何的家人从框架的的方法来嘲笑无效的方法。 例如

  • 我有一个调用Repository方法并返回列表的服务类。现在我想嘲笑它。我的单元测试场景如下: 向模拟存储库添加一些模拟对象 返回模拟对象列表的查询服务类 断言列表大小 我的存储库类: 我的服务等级: 我的对象类: 和我的测试课程: 但是由于我是Mockito的新手,这对我来说有点困难。我想知道如何从FoodService类中获取列表,并且它应该返回在测试类中制作的假对象。

  • 我正试图模拟一个泛型方法,但无论我做什么尝试,都会得到类转换异常。正在测试的类是 而测试类是 其他帮助器类和接口有: 此外,出现此错误的原因可能是:1。您使用final/private/equals()/hashCode()方法中的任一个作为存根。这些方法不能被截取/验证。不支持在非公共父类上声明的模拟方法。2.内部when()不是对mock而是对其他对象调用method。