diff --git a/lucene/core/src/test/org/apache/lucene/util/junitcompat/TestSeedFromUncaught.java b/lucene/core/src/test/org/apache/lucene/util/junitcompat/TestSeedFromUncaught.java
new file mode 100644
index 0000000..041dc40
--- /dev/null
+++ b/lucene/core/src/test/org/apache/lucene/util/junitcompat/TestSeedFromUncaught.java
@@ -0,0 +1,43 @@
+package org.apache.lucene.util.junitcompat;
+
+import org.apache.lucene.util.LuceneTestCase;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Result;
+
+/**
+ * Check that uncaught exceptions result in seed info being dumped to
+ * console. 
+ */
+public class TestSeedFromUncaught extends WithNestedTests {
+  public static class ThrowInUncaught extends AbstractNestedTest {
+    @Test
+    public void testFoo() throws Exception {
+      Thread t = new Thread() {
+        @Override
+        public void run() {
+          throw new RuntimeException("foobar");
+        }
+      };
+      t.start();
+      t.join();
+    }
+  }
+
+  public TestSeedFromUncaught() {
+    super(/* suppress normal output. */ true);
+  }
+
+  /**
+   * Verify super method calls on {@link LuceneTestCase#setUp()}.
+   */
+  @Test
+  public void testUncaughtDumpsSeed() {
+    Result result = JUnitCore.runClasses(ThrowInUncaught.class);
+    Assert.assertEquals(1, result.getFailureCount());
+    String consoleOut = super.getSysErr() + "\n\n" + super.getSysOut();
+    Assert.assertTrue(consoleOut.contains("-Dtests.seed="));
+    Assert.assertTrue(consoleOut.contains("foobar"));
+  }
+}
diff --git a/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
index fdb73b7..20181fc 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
@@ -274,7 +274,7 @@ public abstract class LuceneTestCase extends Assert {
    * Catch any uncaught exceptions on threads within the suite scope and fail the test/
    * suite if they happen.
    */
-  private static final UncaughtExceptionsRule uncaughtExceptionsRule = new UncaughtExceptionsRule(); 
+  private static final UncaughtExceptionsRule uncaughtExceptionsRule = new UncaughtExceptionsRule(null); 
 
   /**
    * This controls how suite-level rules are nested. It is important that _all_ rules declared
@@ -295,7 +295,7 @@ public abstract class LuceneTestCase extends Assert {
   @Rule
   public final TestRule ruleChain = RuleChain
     .outerRule(new RememberThreadRule())
-    .around(new UncaughtExceptionsRule())
+    .around(new UncaughtExceptionsRule(this))
     .around(new TestResultInterceptorRule())
     .around(new SystemPropertiesInvariantRule())
     .around(new InternalSetupTeardownRule())
diff --git a/lucene/test-framework/src/java/org/apache/lucene/util/UncaughtExceptionsRule.java b/lucene/test-framework/src/java/org/apache/lucene/util/UncaughtExceptionsRule.java
index 82e5065..55197df 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/util/UncaughtExceptionsRule.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/util/UncaughtExceptionsRule.java
@@ -20,6 +20,12 @@ public class UncaughtExceptionsRule implements TestRule {
   // This was originally volatile, but I don't think it needs to be. It's the same
   // thread accessing it, always.
   private UncaughtExceptionHandler savedUncaughtExceptionHandler;
+  
+  private final LuceneTestCase ltc;
+  
+  public UncaughtExceptionsRule(LuceneTestCase ltc) {
+    this.ltc = ltc;
+  }
 
   public static class UncaughtExceptionEntry {
     public final Thread thread;
@@ -62,6 +68,15 @@ public class UncaughtExceptionsRule implements TestRule {
           uncaughtExceptions.clear();
         }
 
+        if (!errors.isEmpty()) {
+          if (ltc == null) {
+            // class level failure (e.g. afterclass)
+            LuceneTestCase.reportPartialFailureInfo();
+          } else {
+            // failure in a method
+            ltc.reportAdditionalFailureInfo();
+          }
+        }
         MultipleFailureException.assertEmpty(errors);
       }
     };
diff --git a/modules/analysis/kuromoji/src/test/org/apache/lucene/analysis/kuromoji/TestKuromojiTokenizer.java b/modules/analysis/kuromoji/src/test/org/apache/lucene/analysis/kuromoji/TestKuromojiTokenizer.java
index 36ecc79..08cdc33 100644
--- a/modules/analysis/kuromoji/src/test/org/apache/lucene/analysis/kuromoji/TestKuromojiTokenizer.java
+++ b/modules/analysis/kuromoji/src/test/org/apache/lucene/analysis/kuromoji/TestKuromojiTokenizer.java
@@ -192,7 +192,7 @@ public class TestKuromojiTokenizer extends BaseTokenStreamTestCase {
   }
   
   /** blast some random large strings through the analyzer */
-  @Ignore("FIXME: see LUCENE-3897")
+  //@Ignore("FIXME: see LUCENE-3897")
   public void testRandomHugeStrings() throws Exception {
     checkRandomData(random, analyzer, 200*RANDOM_MULTIPLIER, 8192);
     checkRandomData(random, analyzerNoPunct, 200*RANDOM_MULTIPLIER, 8192);
