gpt4 book ai didi

java - 断言或mockito验证可重用性-错误行

转载 作者:行者123 更新时间:2023-12-02 11:19:25 25 4
gpt4 key购买 nike

我使用 Mockito 进行了很长的测试,我想重用具有不同参数的验证方法,以便测试代码更加干净和可维护。像这样。

@Test
public void aggTest() throws ParseException, IOException {

mockDataLoader();

// This several times with different dates or hours
testProcessSamples("2018-01-01 00:00:00 UTC");
// ...

// Then verify:
verifyDL("HOUR", "OP_DIR", "01/01/2018 00:00:00;ROA_OP-IN-B;;;;;;;;;;;;;;;;;;;");
verifyDL("HOUR", "OP_DIR", "01/01/2018 00:00:00;ROA_OP-OUT-B;2;2;2;;;2;2;;;;;;;;;;;;");
verifyDL("DAY", "AGG_DIR", "31/01/2018 00:00:00;ROA_AGG_Z_IN;;;;;;;;;;;;;;;;;;;");
// About 100 lines like this ...
verifyDL("MONTH", "AGG_DIR", "01/01/2018 00:00:00;ROA_AGG_Y_IN;;;;;;;;ERROR;;;;;;;;;;;"); // Where the error actually is
verifyDL("MONTH", "AGG_DIR", "01/01/2018 00:00:00;ROA_AGG_Q_IN;;;;;;;;;;;;;;;;;;;");
verifyDL("MONTH", "AGG_DIR", "01/01/2018 00:00:00;ROA_AGG_M_IN;;;;;;;;;;;;;;;;;;;");

BDDMockito.verifyNoMoreInteractions(dataLoader);
}


private void verifyDL(String gra, String type, String csv) {
BDDMockito.verify(dataLoader).loadData( // Where JUnit thinks the error is
BDDMockito.argThat(new ContainsCsv(csv)),
BDDMockito.argThat(new MatchXml(gra, type)));
}

但是当它失败时,JUnit 显然会指向 BDDMockito.verify(dataLoader).loadData线作为错误点。我希望它指向测试中的实际行,调用 verifyDL .

完整的堆栈跟踪就在那里,但我必须在实际值之后滚动并每次查找正确的堆栈层,而不是仅仅单击 IDE 上方便的位置即可到达错误点。

正如您所看到的,我已经制作了自己的匹配器来缩短验证代码,但它仍然不能很好地适应一行,因为可维护性需要。

有没有办法告诉 JUnit verifyDL 是一个辅助方法并且应该将其从堆栈中排除?

我需要像宏这样的东西来少写一些并将其转换为实际的验证码。

测试说明:

我正在模拟一个名为 dataLoader 的较低级别的服务,然后我在较高级别上运行一些东西来处理一些输入文件,并且在该 dataLoader 的深处将被调用几次。

完成所有这些之后,我检查对 dataLoader 的调用是否包含它们预期包含的数据。

编辑:

我尝试了这种方法,但我仍然想在测试中选择参数顺序,这是我可以使用 verifyDL 辅助方法完成的事情:

vDL().loadData(argCsv("31/01/2018 23:00:00;AGG_XXXX_OUT;2;2;1;;;2;1;;;;;;;;;;;;"), argXml("HORA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 23:00:00;AGG_Y_OUT;2;2;1;;;2;1;;;;;;;;;;;;"), argXml("HORA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 23:00:00;AGG_ZZZZZZZZZZZ_OUT;;;;;;;;;;;;;;;;;;;"), argXml("HORA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 00:00:00;AGG_XXXX_OUT;2;2;1;;;2;1;;;;;;;;;;;;"), argXml("DIA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 00:00:00;AGG_Y_OUT;2;2;1;;;2;1;;;;;;;;;;;;"), argXml("DIA", "AGG_DIR"));
vDL().loadData(argCsv("31/01/2018 00:00:00;AGG_ZZZZZZZZZZZ_OUT;;;;;;;;;;;;;;;;;;;"), argXml("DIA", "AGG_DIR"));
vDL().loadData(argCsv("01/01/2018 00:00:00;AGG_XXXX_OUT;5;8;7;;;8;7;;;;;;;;;;;;"), argXml("MES", "AGG_DIR"));
vDL().loadData(argCsv("01/01/2018 00:00:00;AGG_Y_OUT;5;8;7;;;8;7;;;;;;;;;;;;"), argXml("MES", "AGG_DIR"));
vDL().loadData(argCsv("01/01/2018 00:00:00;AGG_ZZZZZZZZZZZ_OUT;;;;;;;;;;;;;;;;;;;"), argXml("MES", "AGG_DIR"));

最佳答案

也许最简单的方法是捕获 Mockito 抛出的异常,然后重新抛出一个带有更详细消息的新异常。像这样的事情......

@Test
public void execute_test(){
verifyExecution("First test case","one", "two");
}


public void verifyExecution(String description, String parameter_one, String parameter_two) {
try {
BDDMockito.verify(mockedService).doIt(eq(parameter_one), eq(parameter_one));
} catch (MockitoAssertionError e) {
throw new MockitoAssertionError(String.format("Verification failed while testing case %s, with message:\n%s", description, e.getMessage()));
}
}

这会将“description”参数添加到 Mockito 生成的消息中。通过这种方式,您可以获得 Mockito 提供的所有信息,并将其添加到您正在测试的场景中。

关于java - 断言或mockito验证可重用性-错误行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50040363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com