1 packagestreamax.com;2
3 importjava.util.ArrayList;4 importjava.util.List;5
6 importorg.testng.ITestResult;7 importorg.testng.TestListenerAdapter;8 /*
9 * 监听类10 */
11 public class AssertionListener extendsTestListenerAdapter {12
13 @Override14 public voidonTestStart(ITestResult result) {15 Assertion.flag = true;16 Assertion.errors.clear();17 }18
19 @Override20 public voidonTestFailure(ITestResult tr) {21 this.handleAssertion(tr);22 }23
24 @Override25 public voidonTestSkipped(ITestResult tr) {26 this.handleAssertion(tr);27 }28
29 @Override30 public voidonTestSuccess(ITestResult tr) {31 this.handleAssertion(tr);32 }33
34 private int index = 0;35
36 private voidhandleAssertion(ITestResult tr){37 if(!Assertion.flag){38 Throwable throwable =tr.getThrowable();39 if(throwable==null){40 throwable = newThrowable();41 }42 StackTraceElement[] traces =throwable.getStackTrace();43 StackTraceElement[] alltrace = new StackTraceElement[0];44 for(Error e : Assertion.errors) {45 StackTraceElement[] errorTraces =e.getStackTrace();46 StackTraceElement[] et = this.getKeyStackTrace(tr, errorTraces);47 StackTraceElement[] message = new StackTraceElement[]{new StackTraceElement("message : "+e.getMessage()+" in method : ", tr.getMethod().getMethodName(), tr.getTestClass().getRealClass().getSimpleName(), index)};48 index = 0;49 alltrace = this.merge(alltrace, message);50 alltrace = this.merge(alltrace, et);51 }52 if(traces!=null){53 traces = this.getKeyStackTrace(tr, traces);54 alltrace = this.merge(alltrace, traces);55 }56 throwable.setStackTrace(alltrace);57 tr.setThrowable(throwable);58 Assertion.flag = true;59 Assertion.errors.clear();60 tr.setStatus(ITestResult.FAILURE);61 }62 }63
64 privateStackTraceElement[] getKeyStackTrace(ITestResult tr, StackTraceElement[] stackTraceElements){65 List ets = new ArrayList();66 for(StackTraceElement stackTraceElement : stackTraceElements) {67 if(stackTraceElement.getClassName().equals(tr.getTestClass().getName())){68 ets.add(stackTraceElement);69 index =stackTraceElement.getLineNumber();70 }71 }72 StackTraceElement[] et = newStackTraceElement[ets.size()];73 for (int i = 0; i < et.length; i++) {74 et[i] =ets.get(i);75 }76 returnet;77 }78
79 privateStackTraceElement[] merge(StackTraceElement[] traces1, StackTraceElement[] traces2){80 StackTraceElement[] ste = new StackTraceElement[traces1.length+traces2.length];81 for (int i = 0; i < traces1.length; i++) {82 ste[i] =traces1[i];83 }84 for (int i = 0; i < traces2.length; i++) {85 ste[traces1.length+i] =traces2[i];86 }87 returnste;88 }89 }