Fix #773 Test should not be skipped when the exception is expected
diff --git a/src/main/java/org/testng/internal/Invoker.java b/src/main/java/org/testng/internal/Invoker.java
index f3a1eeb..5271465 100644
--- a/src/main/java/org/testng/internal/Invoker.java
+++ b/src/main/java/org/testng/internal/Invoker.java
@@ -1351,17 +1351,18 @@
       // Exception thrown?
       if (ite != null) {
 
-        if (isSkipExceptionAndSkip(ite)){
-          status = ITestResult.SKIP;
-        }
         //  Invocation caused an exception, see if the method was annotated with @ExpectedException
-        else if (expectedExceptionsHolder != null) {
+        if (expectedExceptionsHolder != null) {
           if (expectedExceptionsHolder.isExpectedException(ite)) {
             testResult.setStatus(ITestResult.SUCCESS);
             status = ITestResult.SUCCESS;
           } else {
-            testResult.setThrowable(expectedExceptionsHolder.wrongException(ite));
-            status= ITestResult.FAILURE;
+            if (isSkipExceptionAndSkip(ite)){
+              status = ITestResult.SKIP;
+            } else {
+              testResult.setThrowable(expectedExceptionsHolder.wrongException(ite));
+              status = ITestResult.FAILURE;
+            }
           }
         } else {
           handleException(ite, testMethod, testResult, failure.count++);
diff --git a/src/test/java/test/skipex/SkippedExceptionTest.java b/src/test/java/test/skipex/SkippedExceptionTest.java
index 22a97b0..80a71e7 100644
--- a/src/test/java/test/skipex/SkippedExceptionTest.java
+++ b/src/test/java/test/skipex/SkippedExceptionTest.java
@@ -36,14 +36,16 @@
     TestListenerAdapter listener= new TestListenerAdapter();

     TestNG test= new TestNG(false);

     test.addListener(listener);

-    test.setVerbose(0);

     test.setTestClasses(new Class[] {TestSkippedExceptionTest.class});

     test.run();

     List<ITestResult> skips= listener.getSkippedTests();

     List<ITestResult> failures= listener.getFailedTests();

+    List<ITestResult> passed = listener.getPassedTests();

     Assert.assertEquals(skips.size(), 1);

     Assert.assertEquals(failures.size(), 1);

+    Assert.assertEquals(passed.size(), 1);

     Assert.assertEquals(skips.get(0).getMethod().getMethodName(), "genericSkipException");

     Assert.assertEquals(failures.get(0).getMethod().getMethodName(), "timedSkipException");

+    Assert.assertEquals(passed.get(0).getMethod().getMethodName(), "genericExpectedSkipException");

   }

 }

diff --git a/src/test/java/test/skipex/TestSkippedExceptionTest.java b/src/test/java/test/skipex/TestSkippedExceptionTest.java
index 8e7cffc..13df237 100644
--- a/src/test/java/test/skipex/TestSkippedExceptionTest.java
+++ b/src/test/java/test/skipex/TestSkippedExceptionTest.java
@@ -14,6 +14,11 @@
     throw new SkipException("genericSkipException is skipped for now");

   }

 

+  @Test(expectedExceptions = SkipException.class)

+  public void genericExpectedSkipException() {

+    throw new SkipException("genericExpectedSkipException should not be skipped");

+  }

+

   @Test

   public void timedSkipException() {

     throw new TimeBombSkipException("timedSkipException is time bombed", "2007/04/10");