我想在捕获异常时编写单元测试来检查log.error函数的工作。 我有这门课:
class SalesMasterModelDateSequenceWrapper {
public static List<EMDate> getDatesClass(IAnalysisExpressionContext context, IContract contract, EMDate analysisDate, IExpressionLogger log, Lookup lookup) {
try {
StringBuilder scenarioName = new StringBuilder();
scenarioName.append(contract.getStringFDA(lookup.getServerFDA("NewContractsForecastName").toLowerCase()));
if (scenarioName.toString().length()==0) return new ArrayList<>();
scenarioName.append("_").append(analysisDate.year()).append(analysisDate.month()).append(analysisDate.day());
if (!context.getScenarioName().contains(scenarioName.toString())){
return Arrays.asList(contract.getValueDate());
}
}
catch (Exception e) {
StringBuilder sb = new StringBuilder();
sb.append("SalesMasterModelDateSequence: ").append(e.getMessage()).append("\n");
for (StackTraceElement stackTraceElement : e.getStackTrace())
{
sb.append(stackTraceElement.toString()).append("\n");
}
log.error(sb.toString());
}
return new ArrayList<>();
}
我想验证我是否会获取log.error(sb.toString())的结果。有人可以帮忙解决这个问题吗?提前致谢。
答案 0 :(得分:0)
应该非常简单,因为直接会向被测方法提供调用error()
的对象。
因此:只需 mock 该对象,例如使用Mockito。
然后使用Mockito的验证功能,确保您看到log.error()
对预期字符串值的调用。
你可以找到很多如何做到这一点的例子;例如here。
根据您的具体示例,您甚至可以编写自己的日志记录接口的存根实现;并让代码简单地记住给它的任何字符串。这样你就可以简单地要求存根返回传入其中的字符串。
答案 1 :(得分:0)
取消模拟框架以创建IExpressionLogger
的模拟,并在测试中验证是否已使用预期参数调用其error()
方法:
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
private IExpressionLogger expressionLogger;
@Mock
private Lookup lookup;
@Test
public void exceptionMessageLoggedAsError() {
doThrow(new RuntimeException("UnitTest").when(lookup).getServerFDA(anyString());
new SalesMasterModelDateSequenceWrapper(/* other parameters */,expressionLogger, lookup).getDatesClass(/* parameters */);
verify(expressionLogger).error("the expected message containing substring 'UnitTest' from Exception");
}