Java 编写单元测试以检查登录异常
我想编写单元测试来检查捕获异常时log.error函数的工作情况。 我有这门课: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) {
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");
}
检查这是否有帮助: