मेरे पास निम्न कोड है जिसे मैं सफलतापूर्वक पूरा करने की उम्मीद करता हूं लेकिन कोड "विफल" ("यह नहीं पहुंचा जाना चाहिए") में विफल रहता है; "। कोई व्याख्या कर सकते हैं कृपया क्यों डिफ़ॉल्ट न आया हुआ अपवाद हैंडलर नहीं बुलाया जाता है:जूनिट में बहु-थ्रेड परीक्षण के लिए बिना किसी अपवाद वाले हैंडलर का उपयोग कैसे करें?
public class UncaughtExceptionTest extends TestCase
implements UncaughtExceptionHandler {
private final List<Throwable> uncaughtExceptions =
new CopyOnWriteArrayList<Throwable>();
class UncaughtExceptionTestInnerClass implements Runnable {
private final ScheduledThreadPoolExecutor executor =
new ScheduledThreadPoolExecutor(1);
private final CountDownLatch latch;
UncaughtExceptionTestInnerClass(CountDownLatch latch) {
this.latch = latch;
executor.schedule(this, 50, TimeUnit.MILLISECONDS);
}
@Override
public void run() {
System.out.println("This is printed");
fail("this should fail");
latch.countDown();
}
}
@Test
public void testUncaughtExceptions() {
Thread.setDefaultUncaughtExceptionHandler(this);
CountDownLatch latch = new CountDownLatch(1);
UncaughtExceptionTestInnerClass testTheInnerClass =
new UncaughtExceptionTestInnerClass(latch);
try {
if (!latch.await(1, TimeUnit.SECONDS)) {
if (uncaughtExceptions.size() > 0) {
Throwable exception = uncaughtExceptions.get(0);
System.out.println("First uncaught exception: " +
exception.getMessage());
}
else {
fail("this should not be reached");
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void uncaughtException(Thread t, Throwable e) {
uncaughtExceptions.add(e);
}
}
'असफल क्यों है (" यह असफल होना चाहिए "); 'वहां लाइन? क्या यह जानबूझकर है? इस तरह लच कभी गिना जाता है। – BalusC
@ बालससी: हाँ, यह जानबूझकर है। परीक्षण को सही तरीके से पास करने के लिए, latch.await() विधि को समय निकालना चाहिए, जिससे यह झूठी वापसी हो सकती है। कोड को तब तक असीमित AssertionFailedError अपवाद से संदेश मुद्रित करना चाहिए जिसे आप पूछ रहे लाइन पर फेंक दिया गया था। –