java - Mockito - 需要但未调用 : Actually, 与此模拟的交互为零

标签 java unit-testing mockito junit4

我知道已经有至少两个相同的问题被问到,但我仍然不明白为什么我会遇到异常。 我需要对这个方法进行单元测试:

void setEyelet(final PdfWriter printPdf, final float posX, final float posY) {

    InputStream is = WithDefinitions.class.getResourceAsStream(RES_EYELET); //RES_EYELET is a pdf.
    PdfContentByte canvas = printPdf.getDirectContent();

    PdfReader reader = new PdfReader(is);
    PdfImportedPage page = printPdf.getImportedPage(reader, 1);
    canvas.addTemplate(page, posX, posY);
    reader.close();
}

并验证

canvas.addTemplate(page, posX, posY); 

被调用了。

此方法嵌套在另一个方法中:

void computeEyelets(final PdfWriter printPdf) {
        float lineLeft = borderLeft + EYELET_MARGIN;
        float lineRight = printPdfWidth - borderRight - EYELET_MARGIN - EYELET_SIZE;
        float lineTop = printPdfHeight - borderTop - EYELET_MARGIN - EYELET_SIZE;
        float lineBottom = borderBottom + EYELET_MARGIN;
        float eyeletDistMinH = 20;
        if (eyeletDistMinH != 0 || eyeletDistMinV != 0) {
         setEyelet(printPdf, lineLeft, lineBottom);
    }

最后是我的单元测试代码:

public void computeEyeletsNoMirror() {
    PdfWriter pdfWriter = Mockito.mock(PdfWriter.class);
    PdfContentByte pdfContentByte = Mockito.mock(PdfContentByte.class);
    Mockito.when(pdfWriter.getDirectContent()).thenReturn(pdfContentByte);
    WithDefinitions withDefinitions = Mockito.mock(WithDefinitions.class);
    float lineLeft = BORDER_LEFT + EYELET_MARGIN;
    float lineBottom = BORDER_BOTTOM + EYELET_MARGIN;

    withDefinitions.setEyeletDistMinH(20);
    withDefinitions.setEyeletDistMinV(20);
    withDefinitions.setMirror(false);

    withDefinitions.computeEyelets(pdfWriter);

    Mockito.verify(pdfContentByte).addTemplate(
        Mockito.any(PdfImportedPage.class),
        Mockito.eq(lineLeft),
        Mockito.eq(lineBottom)
    );

我没有 final方法,我使用模拟的 pdf 编写器作为参数。我还需要做什么才能通过测试?

更新 以下是异常消息:

Wanted but not invoked:
 pdfContentByte.addTemplate(
  <any>,
  62.36221,
  62.36221
);
-> at ...tools.pdf.superimpose.WithDefinitionsTest.computeEyeletsNoMirror(WithDefinitionsTest.java:336)
Actually, there were zero interactions with this mock.

更新 2 用真实实例替换模拟的 WithDefinitions 对象后,我得到以下输出:

Argument(s) are different! Wanted:
pdfContentByte.addTemplate(
  <any>,
  62.36221,
  62.36221
);
-> at ...tools.pdf.superimpose.WithDefinitionsTest.computeEyeletsNoMirror(WithDefinitionsTest.java:336)
Actual invocation has different arguments:
pdfContentByte.addTemplate(
  null,
  48.18898,
  48.18898
);
-> at ...tools.pdf.superimpose.WithDefinitions.setEyelet(WithDefinitions.java:850)

最佳答案

您正在模拟您正在测试的对象。这是没有意义的。您应该创建一个真正的 WithDefinitions 对象并调用其真正的方法来测试它。如果你模拟它,根据定义,它的所有方法都被什么都不做的模拟实现所取代。

替换

WithDefinitions withDefinitions = Mockito.mock(WithDefinitions.class);

通过类似的东西

WithDefinitions withDefinitions = new WithDefinitions();

关于java - Mockito - 需要但未调用 : Actually, 与此模拟的交互为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28089601/

相关文章:

java - 如何使用 OpenCV 和 Java 检测图像/倒置图像中的倒置文本

Python:在 VS Code 中发现单元测试失败

django - 如何使用 Django 模型应用测试驱动开发?

java - 当我组合构造函数注入(inject)(子类)和属性注入(inject)(父类)时,@InjectMocks 给我 null

java - 如何在android对话框窗口中更新多选

java - 如何管理来自在单独线程中运行的多个外部命令的多个标准输出?

Eclipse 中项目的 Java 模板

iphone - OCUnit 测试 NSNotification 传递

java - 如何在 JUnit 中重用方法和测试?

flutter - 用 mockito 测试 riverpod 的正确方法是什么