Mockito - 需要但未调用:实际上,与此模拟的交互为零
Mockito - Wanted but not invoked: Actually, there were zero interactions with this mock
我知道已经有至少两个相同的问题被问到,但我仍然不明白为什么我会遇到异常。
我需要对这个方法进行单元测试:
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)
);
我没有最终方法,我使用模拟的 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();
我知道已经有至少两个相同的问题被问到,但我仍然不明白为什么我会遇到异常。 我需要对这个方法进行单元测试:
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)
);
我没有最终方法,我使用模拟的 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();