Junit4: рдЯрд╛рдЗрдордЖрдЙрдЯ рдереНрд░реЗрдбрдЧреНрд░реБрдк рдХреЛ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреЛ рдирд┐рд░реНрдорд┐рдд 11 рдлрд╝рд░ре░ 2020  ┬╖  27рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: junit-team/junit4

рд╡рд╛рддрд╛рд╡рд░рдг:

рдЧреНрд░рд╣рдг: рд╕рдВрд╕реНрдХрд░рдг: 2019-09 рдЖрд░ (4.13.0), рдмрд┐рд▓реНрдб рдЖрдИрдбреА: 20190917-1200
EclEmma 3.1.2.201903112331 org.eclipse.eclemma.feature.feature.group рдЧреНрд░рд╣рдг рдПрдХреНрд▓реЗрдореНрдорд╛
рдЬреБрдиреАрдЯ 4.13
рд╡рд┐рдВрдбреЛрдЬ 10 x64
рдЬрд╛рд╡рд╛ 1.8u241

рдореБрджреНрджрд╛:

рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдкрд░ рдХрд╡рд░реЗрдЬ рдЪрд▓рд╛рддреЗ рд╕рдордп рдореИрдВрдиреЗ рдПрдХ рдЕрдЬреАрдм рддреНрд░реБрдЯрд┐ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЧреНрд░рд╣рдг рдореЗрдВ Google рдЕрдорд░реВрдж рдХреЗ рдХреИрд╢рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдХрд╡рд░реЗрдЬ рддреНрд░реБрдЯрд┐ рдХреЛрдб 5013 рдФрд░ java.net.SocketException: рдХрдиреЗрдХреНрд╢рди рд░реАрд╕реЗрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдХрд╡рд░реЗрдЬ рд╕рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдореИрдВ JUnit 4.12 рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реВрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░реАрдХреНрд╖рдг рджреЛрдиреЛрдВ рд╣реА рдХрд╡рд░реЗрдЬ рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдзрд┐:
https://github.com/ReactiveX/RxJava/blob/5f6aafcbaa97f330ad2007f4ad02c5e33db8914b/src/test/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableGroupByTest.java#L1917

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдХреИрд╢ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
https://github.com/ReactiveX/RxJava/blob/5f6aafcbaa97f330ad2007f4ad02c5e33db8914b/src/test/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableGroupByTest.java#L2194

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░рд┐рдпрд╛:

  • рдЕрдЧрд░ рдореИрдВ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ "gradlew test jacocoTestReport" рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ HTML рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИред
  • рдЕрдЧрд░ рдореИрдВ рдЧреНрд░рд╣рдг рд╕реЗ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ "рдХрд╡рд░реЗрдЬ рдЕрд╕> рдЬреБрдиреАрдЯ рдЯреЗрд╕реНрдЯ" рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЙрд╕реА 5013 рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЕрдЧрд░ рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕/рдкреИрдХреЗрдЬ/рд╡рд┐рдзрд┐ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдХрд╡рд░реЗрдЬ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рд╕рд▓рд╛рд╣ рджреЗрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирдорд╕реНрдХрд╛рд░ рджреЛрд╕реНрддреЛрдВ

@akarnokd JaCoCo рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рд╕реЗ рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдпрд╣рд╛рдВ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@marcphilipp рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ (https://github.com/junit-team/junit4/issues/1652#issuecomment-593559646)ред

рд╕реНрдерд┐рд░ рдмреНрд▓реЙрдХ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж java.lang.ApplicationShutdownHooks.hooks . рдореЗрдВ рдПрдХ рд╢рдЯрдбрд╛рдЙрди рд╣реБрдХ рд╣реЛрддрд╛ рд╣реИ

{Thread@1552} "Thread[Thread-0,5,main]" -> {Thread@1552} "Thread[Thread-0,5,main]"

рдФрд░ CacheBuilder.newBuilder() рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рджреЛ рд╣реИрдВ

{LogManager$Cleaner@1551} "Thread[Logging-Cleaner,5,FailOnTimeoutGroup]" -> {LogManager$Cleaner@1551} "Thread[Logging-Cleaner,5,FailOnTimeoutGroup]"
{Thread@1552} "Thread[Thread-0,5,main]" -> {Thread@1552} "Thread[Thread-0,5,main]"

LogManager$Cleaner@1551 java.util.logging.LogManager (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/util/logging/LogManager рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред .java#L253) рдХреНрдпреЛрдВрдХрд┐ com.google.common.cache.CacheBuilder java.util.logging $ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (https://github.com/google/guava/blob/v28.2/guava/src/com/google/common/cache/ рдХреИрд╢реЗрдмрд┐рд▓реНрдбрд░.рдЬрд╛рд╡рд╛#рдПрд▓226)ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рднреА FailOnTimeoutGroup рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ org.junit.rules.Timeout (https://github.com/junit-team/junit4/blob/r4.13/src/main/java/org/junit) рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред /рдЖрдВрддрд░рд┐рдХ/рдзрд╛рд╡рдХ/рдХрдерди/FailOnTimeout.java#L123)ред

рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдЗрд╕ рд╣реБрдХ рдХреА рд╢реБрд░реБрдЖрдд IllegalThreadStateException (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/Thread.java рдкрд░) #L709), рдХреНрдпреЛрдВрдХрд┐ рд╕рдореВрд╣ рдкрд╣рд▓реЗ рд╣реА рдирд╖реНрдЯ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ (https://github.com/junit-team/junit4/blob/r4.13/src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java # рдПрд▓ 140)ред

рдпрд╣ рдЕрдкрд╡рд╛рдж рдмрд╛рдж рдХреЗ рд╣реБрдХ (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/ApplicationShutdownHooks.java#L101-L103) рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рдЪреБрдкрдЪрд╛рдк рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/Shutdown.java#L115-L129)ред

рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╣реБрдХ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ рд╡рд╣ keySet рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/ApplicationShutdownHooks.java#L97 ) IdentityHashMap (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/ApplicationShutdownHooks.java#L39) рдХрд╛ рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рджреМрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝реЗрдВред

JUnit 4.12 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ FailOnTimeoutGroup рдХрд╛ рд╡рд┐рдирд╛рд╢ JUnit 4.13 (https://github.com/junit-team/junit4/commit/63fd27710ee2bab6fdf00965f41ef12b79120c70) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХреЗ рджреМрд░рд╛рди рджреЗрдЦреЗ рдЧрдП 4.12 рдФрд░ 4.13 рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ (https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/jacoco/SHw3R6cvZSs/yaFgd7XUAQAJ):

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;

import java.util.concurrent.TimeUnit;

public class ExampleTest {
  <strong i="34">@Rule</strong>
  public Timeout globalTimeout = new Timeout(5, TimeUnit.MINUTES);

  <strong i="35">@Test</strong>
  public final void test() {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
      <strong i="36">@Override</strong>
      public void run() {
        System.err.println("hook executed");
      }
    }));
  }
}

рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЬреБрдиреАрдЯ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

import java.util.logging.LogManager;

public class Example {
  public static void main(String[] args) throws Exception {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
      <strong i="40">@Override</strong>
      public void run() {
        System.err.println("example hook");
      }
    }));

    ThreadGroup group = new ThreadGroup("example group");
    Thread thread = new Thread(group, new Runnable() {
      <strong i="41">@Override</strong>
      public void run() {
        LogManager.getLogManager();
      }
    }, "example thread");
    thread.start();
    thread.join();
    group.destroy();
  }
}

рддреЛ рдореИрдВ рдУрдкрдирдЬреЗрдбреАрдХреЗ рдореЗрдВ рдЯрд┐рдХрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯрд┐рдХрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж https://bugs.openjdk.java.net/browse/JDK-6704979

рдлрд┐рд░ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЬреБрдиреАрдЯ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╕рднреА 27 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдПрдХ рд╕реНрдЯреИрдХрдЯреНрд░реИрдХ рдФрд░/рдпрд╛ рдЧреНрд░реИрдбрд▓ рдмрд┐рд▓реНрдб рд╕реНрдХреИрди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреЛрдИ JVM рдХреНрд░реИрд╢ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдирд╣реАрдВ рд╣реИред рдХрдиреЗрдХреНрд╢рди рдЦреЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЧреНрд░рд╣рдг рддреНрд░реБрдЯрд┐ (java.net.SocketException: рдХрдиреЗрдХреНрд╢рди)ред рдЬрдм рдореИрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдЧреНрд░реИрдбрд▓ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреАред

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореБрдЭреЗ рдЧреНрд░рд╣рдг рдпрд╛ рдПрдХреНрд▓реЗрдореНрдорд╛ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЙрдирдХреЗ рд╕рд╛рде рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдареАрдХред рдПрдХ рдЖрдЦрд┐рд░реА рдкреНрд░рд╢реНрдиред рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреБрдиреАрдЯ 4.13 рдПрдХреАрдХрд░рдг рдореЗрдВ рдЧреНрд░рд╣рдг рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ?

рдЦреИрд░, рд╣рдореЗрд╢рд╛ рдПрдХ рдореМрдХрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдХреБрдЫ рддреЛрдбрд╝рд╛ред рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд╣рдордиреЗ рдПрдХреАрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдПрдкреАрдЖрдИ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред

рдЬрдм рдореИрдВрдиреЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреА рдЦреЛрдЬ рдХреА рддреЛ рдореБрдЭреЗ https://stackoverflow.com/a/42904311/95725 рдорд┐рд▓рд╛ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдореГрддрд┐ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ 4.13 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рд╕рд╛рде рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдореЗрдореЛрд░реА-рд╡рд╛рд░ рдкрд╛рд░ рдХрд░ рд▓реЗрдВред

рдпрд╣ рднреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреНрд▓рд╛рд╕рдкрд╛рде рдкрд░ рдЬреБрдиреАрдЯ рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдВред

рд╣рд╛рдВ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рдХреИрд╢-рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЬреАрдм рд╣реИ, рди рдХрд┐ рдЕрдиреНрдп 12000+ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдПред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдПрдХреНрд▓реЗрдореНрдорд╛ рд▓реЛрдЧреЛрдВ рд╕реЗ рдХреЛрдИ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИред

рдирдорд╕реНрддреЗред рдореБрдЭреЗ EclEmma рд▓реЛрдЧреЛрдВ рд╕реЗ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/jacoco/SHw3R6cvZSs/yaFgd7XUAQAJ

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рдЯрдбрд╛рдЙрди рд╣реБрдХ рдХреЛ 4.13 рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ 4.12 рдореЗрдВ рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╡рд░реЗрдЬ рд╡рд┐рдлрд▓рддрд╛ред

рдпрд╣рд╛рдВ рдПрдХ рдЬреБрдиреАрдЯ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЗрд╕реА рддрд░рд╣ рдПрдХреНрд▓реЗрдореНрдорд╛ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░реЗрдЧрд╛) рдЬреЛ рдХрднреА-рдХрднреА "рд╣реБрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд" рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдХрднреА-рдХрднреА 4.13 рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ:

import java.util.concurrent.TimeUnit;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;

import com.google.common.cache.CacheBuilder;

public class ExampleTest {

  static {
    System.err.println("registering hook");
    Thread thread = new Thread(new Runnable() {
      <strong i="6">@Override</strong>
      public void run() {
        System.err.println("hook executed");
      }
    });
    Runtime.getRuntime().addShutdownHook(thread);
    System.err.println(thread.getThreadGroup());
  }

  <strong i="7">@Rule</strong>
  public Timeout timeout = new Timeout(5, TimeUnit.MINUTES);

  <strong i="8">@Test</strong>
  public void test() {
    CacheBuilder.newBuilder() //
      .<Integer, Object>build();
  }
}

рдирдорд╕реНрдХрд╛рд░ рджреЛрд╕реНрддреЛрдВ

@akarnokd JaCoCo рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рд╕реЗ рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдпрд╣рд╛рдВ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@marcphilipp рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ (https://github.com/junit-team/junit4/issues/1652#issuecomment-593559646)ред

рд╕реНрдерд┐рд░ рдмреНрд▓реЙрдХ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж java.lang.ApplicationShutdownHooks.hooks . рдореЗрдВ рдПрдХ рд╢рдЯрдбрд╛рдЙрди рд╣реБрдХ рд╣реЛрддрд╛ рд╣реИ

{Thread@1552} "Thread[Thread-0,5,main]" -> {Thread@1552} "Thread[Thread-0,5,main]"

рдФрд░ CacheBuilder.newBuilder() рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рджреЛ рд╣реИрдВ

{LogManager$Cleaner@1551} "Thread[Logging-Cleaner,5,FailOnTimeoutGroup]" -> {LogManager$Cleaner@1551} "Thread[Logging-Cleaner,5,FailOnTimeoutGroup]"
{Thread@1552} "Thread[Thread-0,5,main]" -> {Thread@1552} "Thread[Thread-0,5,main]"

LogManager$Cleaner@1551 java.util.logging.LogManager (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/util/logging/LogManager рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред .java#L253) рдХреНрдпреЛрдВрдХрд┐ com.google.common.cache.CacheBuilder java.util.logging $ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (https://github.com/google/guava/blob/v28.2/guava/src/com/google/common/cache/ рдХреИрд╢реЗрдмрд┐рд▓реНрдбрд░.рдЬрд╛рд╡рд╛#рдПрд▓226)ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рднреА FailOnTimeoutGroup рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ org.junit.rules.Timeout (https://github.com/junit-team/junit4/blob/r4.13/src/main/java/org/junit) рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред /рдЖрдВрддрд░рд┐рдХ/рдзрд╛рд╡рдХ/рдХрдерди/FailOnTimeout.java#L123)ред

рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдЗрд╕ рд╣реБрдХ рдХреА рд╢реБрд░реБрдЖрдд IllegalThreadStateException (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/Thread.java рдкрд░) #L709), рдХреНрдпреЛрдВрдХрд┐ рд╕рдореВрд╣ рдкрд╣рд▓реЗ рд╣реА рдирд╖реНрдЯ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ (https://github.com/junit-team/junit4/blob/r4.13/src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java # рдПрд▓ 140)ред

рдпрд╣ рдЕрдкрд╡рд╛рдж рдмрд╛рдж рдХреЗ рд╣реБрдХ (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/ApplicationShutdownHooks.java#L101-L103) рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рдЪреБрдкрдЪрд╛рдк рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/Shutdown.java#L115-L129)ред

рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╣реБрдХ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ рд╡рд╣ keySet рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/ApplicationShutdownHooks.java#L97 ) IdentityHashMap (https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/lang/ApplicationShutdownHooks.java#L39) рдХрд╛ рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рджреМрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝реЗрдВред

JUnit 4.12 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ FailOnTimeoutGroup рдХрд╛ рд╡рд┐рдирд╛рд╢ JUnit 4.13 (https://github.com/junit-team/junit4/commit/63fd27710ee2bab6fdf00965f41ef12b79120c70) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХреЗ рджреМрд░рд╛рди рджреЗрдЦреЗ рдЧрдП 4.12 рдФрд░ 4.13 рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ (https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/jacoco/SHw3R6cvZSs/yaFgd7XUAQAJ):

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;

import java.util.concurrent.TimeUnit;

public class ExampleTest {
  <strong i="34">@Rule</strong>
  public Timeout globalTimeout = new Timeout(5, TimeUnit.MINUTES);

  <strong i="35">@Test</strong>
  public final void test() {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
      <strong i="36">@Override</strong>
      public void run() {
        System.err.println("hook executed");
      }
    }));
  }
}

рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЬреБрдиреАрдЯ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

import java.util.logging.LogManager;

public class Example {
  public static void main(String[] args) throws Exception {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
      <strong i="40">@Override</strong>
      public void run() {
        System.err.println("example hook");
      }
    }));

    ThreadGroup group = new ThreadGroup("example group");
    Thread thread = new Thread(group, new Runnable() {
      <strong i="41">@Override</strong>
      public void run() {
        LogManager.getLogManager();
      }
    }, "example thread");
    thread.start();
    thread.join();
    group.destroy();
  }
}

рддреЛ рдореИрдВ рдУрдкрдирдЬреЗрдбреАрдХреЗ рдореЗрдВ рдЯрд┐рдХрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯрд┐рдХрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж https://bugs.openjdk.java.net/browse/JDK-6704979

рдлрд┐рд░ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЬреБрдиреАрдЯ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@Godin рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ

@kcooney рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ/рдпрд╛рдж рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ ThreadGroup рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХреНрдпрд╛ рдерд╛?

@marcphilipp рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдЯреВрдЯрдирд╛ https://github.com/junit-team/junit4/commit/63fd27710 рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ рдерд╛ рдЬрд┐рд╕реЗ @ elrodro83 рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

рдереНрд░реЗрдбрдЧреНрд░реБрдк рдХреЛ https://github.com/junit-team/junit4/commit/1768d08d0 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

@akarnokd рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдХреНрдпрд╛ рдЖрдкрдиреЗ JUL рдХреЛ рдЬрд▓реНрджреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕реНрдЯреИрдЯрд┐рдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ?

рдирд╣реАрдВред рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╡рд░реЗрдЬ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдм рддрдХ, рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдХрд╡рд░реЗрдЬ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдЙрди рдХреИрд╢рдмрд┐рд▓реНрдбрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдХреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬрдмрдХрд┐ рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдХреА рдЬрд╛ рд░рд╣реА рдХрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдереАред

63fd277 . рдХреЗ рдХрд╛рд░рдг

рдпрд╛рдиреА #1517 рдмреИрдХрд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдПред

рдЬрд╝рд░рд╛ рд╕реБрдирд┐рдП рд╕рднреАред @jglick рдиреЗ #1517 рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рд╣рдо #1517 рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗ рд▓реЗрдВ рдпрд╛ рдЗрд╕реЗ рдСрдкреНрдЯ-рдЗрди рдХрд░реЗрдВред

рдкреАрдЖрд░ #1517 рдХреЗ ThreadGroup.destroy() рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рднреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИред

рдПрдХреНрд▓рд┐рдкреНрд╕ рдХреИрд▓рд┐рдлрд╝реЛрд░реНрдирд┐рдпрд╛ рдореЗрдВ рдпрд╣ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╡рд┐рдлрд▓ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдереНрд░реЗрдб рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА "рджреМрдбрд╝" рдФрд░ ThreadGroup.destroy() рдХреА рдХреЙрд▓ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИред
рдФрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдирд┐рдпрдо рдФрд░ рд╕реНрдерд┐рд░ рдереНрд░реЗрдбрдЧреНрд░реБрдк рдХреЗ рдмреАрдЪ рд╕реНрдкрд╖реНрдЯ рдЖрджреЗрд╢ рдХреА рд╕реНрдерд┐рддрд┐ рднреА рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╕рдореВрд╣ рдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдирд┐рдпрдо рдХреЗ рдмрд╛рд╣рд░ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрджрд┐ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛

  1. рдПрдХ "рдСрдкреНрдЯ-рдЗрди" (рдпрд╛ "рдСрдкреНрдЯ-рдЖрдЙрдЯ") рдЬреЛрдбрд╝реЗрдВред
  2. рдПрдХ рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░ рд╢рд╛рдпрдж "рдирд╖реНрдЯ" рди рд╣реЛ, рдпрджрд┐ рдХреЛрдИ рдЙрдк-рд╕рдореВрд╣ "рдХреЛрдИ рдирд╣реАрдВ-рдбрд┐рдорди-рд╕рдореВрд╣" рд╣реИ (рдбреЗрдорди рд╕рдореВрд╣ рдЕрдВрддрд┐рдо рд╕рдорд╛рдкреНрддрд┐ рдзрд╛рдЧреЗ рдХреЗ рд╕рд╛рде рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрди рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд╛рд╢ рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд┐рд╕реА рднреА-рдбреЗрдорди-рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ , рдпрд╣ рдкрд░реЗрд╢рд╛рдиреА рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдРрд╕реЗ рдереНрд░реЗрдб-рдЧреНрд░реБрдк рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдпрдж рд╕реНрдерд┐рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред)
  3. рдереНрд░реЗрдб рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рджреМрдбрд╝-рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реЛрдХреЗрдВ/рдХрдо рдХрд░реЗрдВред рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╢рд╛рдпрдж "рдереНрд░реЗрдб" рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ "рдереНрд░реЗрдбрдЧреНрд░реБрдк.рдЗрдВрдЯрд░рдкреНрдЯ ()" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдореВрд╣реЛрдВ рдФрд░ рдЙрдк-рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред

рдЕрд╕реНрдерд╛рдпреА рдХрд╛рдордХрд╛рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рднреА "рд╕реНрдереИрддрд┐рдХ" рдереНрд░реЗрдб-рд╕рдореВрд╣ рдХрд┐рд╕реА рднреА рдЯрд╛рдЗрдордЖрдЙрдЯ рдирд┐рдпрдо рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдСрдкреНрдЯ-рдЖрдЙрдЯ рдзреНрд╡рдЬ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@kcooney рдЖрдк рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ?

Timeout рдирд┐рдпрдо рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Builder рд╣реИред FMPOV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЕрдЧрд░ рд╡рд╣рд╛рдВ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ 4.13 рдХреЗ рдХрдо рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдХрдо рд░рд┐рдкреЛрд░реНрдЯ рд╣реЛред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдереНрд░реЗрдбрдЧреНрд░реБрдк рд▓реАрдХреЗрдЬ рдХреА рдХрдИ рд░рд┐рдкреЛрд░реНрдЯреЗрдВ рдереАрдВ, рдФрд░ рдЬреБрдиреАрдЯ 4.12 рд╕реЗ рдереНрд░реЗрдбрдЧреНрд░реБрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ (рджреЗрдЦреЗрдВ https://github.com/junit-team/junit4/commit/1768d08)ред

рдЕрдЧрд░ рд╣рдордиреЗ 4.13 рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реЛрддрд╛, рддреЛ рдореИрдВ рдирдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдСрдкреНрдЯ-рдЗрди рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрднреА рдСрдкреНрдЯ-рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рдкрд░рд┐рд╡рд░реНрддрди рдЬреИрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдирдИ рд░рд┐рд▓реАрдЬрд╝ 4.14 рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдСрдкреНрдЯ рдЗрди рдпрд╛ рдСрдкреНрдЯ рдЖрдЙрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред JUnit 4.x рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╕рд┐рд╕реНрдЯрдо рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдбреЗрд╡рд┐рдб рд╕реИрдл рдиреЗ рдЕрддреАрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдЖрдкрддреНрддрд┐ рдЬрддрд╛рдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдереНрд░реЗрдб рд╕рдореВрд╣ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдореЙрди рд╕рдореВрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ (рдмрд╛рд▓ рдереНрд░реЗрдб рд╕рдореВрд╣ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдбрд┐рдорди рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣реИ) рдФрд░ рд╣рдо рдЙрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдмрдЧ рдлрд┐рдХреНрд╕ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдбрд┐рдорди рдереНрд░реЗрдб рд╕рдореВрд╣ рдмрдирд╛рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдкреАрдЖрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ?

рдХреНрдпрд╛ рд╣рдо рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ 4.13.2 рдХреЛ рдЬрд▓реНрджреА рд░рд┐рд╣рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕реБрд░рдХреНрд╖рд╛ рдореБрджреНрджреЛрдВ <4.13.1 рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдореБрдЭреЗ рдХреБрдЫ рд╣рдж рддрдХ рдЕрд╡рд░реБрджреНрдз рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдПрдлрд╡рд╛рдИрдЖрдИ рдореЗрд░рд╛ рдиреНрдпреВрдирддрдо рдкреБрдирд░реБрддреНрдкрд╛рджрд┐рдд рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреЛрд╕реНрдЯ рдФрд░ рдЗрд╕ рдЬреАрдердм рд░реЗрдкреЛ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ j256 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рдордиреЗ рдЕрднреА рддрдХ рд╕рдордпрд╕реАрдорд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рд╣реИред рдореИрдВрдиреЗ рдЪреАрдЬреЛрдВ рдХреЛ 4.13.2 рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

/** Workaround for the already fixed JUnit 4 issue #1652 (<https://github.com/junit-team/junit4/issues/1652>):
 * Can be used in JUnit 4.13 and 4.13.1 in tests with a timeout to prevent the thread group from being destroyed
 * and thus JaCoCo (used e.g. by EclEmma) loosing its collected data. */
public static void workaround_for_junit4_issue_1652() {
    String version = junit.runner.Version.id();
    if (!"4.13.1".equals(version) && !"4.13".equals(version))
        fail("Workaround for JUnit 4 issue #1652 required for JUnit 4.13 and 4.13.1 only; actual version: "
           + version);
    Thread thread = Thread.currentThread();
    if (!"Time-limited test".equals(thread.getName())) fail("Workaround only required for a test with a timeout.");
    new Thread(thread.getThreadGroup(), new Runnable() {
        <strong i="6">@Override</strong>
        public void run() {
            try {
                while (!thread.isInterrupted()) Thread.sleep(100);
            } catch (InterruptedException e) {}
        }
    }).start();
}

@Test(timeout = 42)
public void test() {
    workaround_for_junit4_issue_1652();
    // ...
}

рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде 4.13.2 рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреЛрдИ рдЕрдкрдбреЗрдЯ @kcooney? рдлрд┐рд░ рд╕реЗ, 4.13.1 рд╕реЗ рдкрд╣рд▓реЗ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рдЕрдм рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рдмрдЧ рдХреЗ рдХрд╛рд░рдг рд╕реАрдЖрдИ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдзрдиреНрдпрд╡рд╛рджред

@j256 4.13.2 рдЕрдм рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж @marcphilipp !

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

bigmikef picture bigmikef  ┬╖  39рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pbenedict picture pbenedict  ┬╖  27рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

javornikolov picture javornikolov  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sbrannen picture sbrannen  ┬╖  22рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lvc picture lvc  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ