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

Java 编写单元测试以检查登录异常,java,unit-testing,exception-handling,mockito,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) {

我想编写单元测试来检查捕获异常时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<>();

}
类SalesMasterModelDateSequenceWrapper{
公共静态列表getDatesClass(IAnalysisExpressionContext上下文、IContract契约、EMDate analysisDate、IExpressionLogger日志、查找){
试一试{
StringBuilder scenarioName=新建StringBuilder();
scenarioName.append(contract.getStringFDA(lookup.getServerFDA(“NewContractsForecastName”).toLowerCase());
if(scenarioName.toString().length()==0)返回新的ArrayList();
scenarioName.append(“”).append(analysisDate.year()).append(analysisDate.month()).append(analysisDate.day());
如果(!context.getScenarioName().包含(scenarioName.toString())){
返回数组.asList(contract.getValueDate());
}
}
捕获(例外e){
StringBuilder sb=新的StringBuilder();
sb.append(“SalesMasterModelDateSequence:”).append(e.getMessage()).append(“\n”);
对于(StackTraceElement StackTraceElement:e.getStackTrace())
{
sb.append(stackTraceElement.toString()).append(“\n”);
}
log.error(sb.toString());
}
返回新的ArrayList();
}

我想验证一下,我将获取log.error(sb.toString())的结果。有人能帮我解决这个问题吗?提前谢谢。

应该非常简单,因为您直接提供了对象,在该对象上,被测试的方法调用了
error()

因此:只需模拟该对象,例如使用Mockito

然后使用Mockito的verify功能确保看到对
log.error()
的调用以及预期的字符串值

你可以找到很多例子,比如

给出您的具体示例,您甚至可以编写自己的日志接口存根实现;让代码简单地记住给它的任何字符串。这样,您就可以在之后简单地要求存根返回传递给它的字符串。

取消模拟框架,以创建对
IExpressionLogger
的模拟est验证其
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");

}
检查这是否有帮助: