编写单元测试以检查异常中的登录

时间:2017-04-26 17:22:57

标签: java unit-testing exception-handling mockito

我想在捕获异常时编写单元测试来检查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())的结果。有人可以帮忙解决这个问题吗?提前致谢。

2 个答案:

答案 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");

}