26

Jersey で JUL の代わりに SLF4J を使用する方法を説明している便利な記事を見つけました。これで、単体テストは次のようになります (完全に機能します)。

public class FooTest extends JerseyTest {
  @BeforeClass
  public static void initLogger() {
    java.util.logging.Logger rootLogger =
      java.util.logging.LogManager.getLogManager().getLogger("");
    java.util.logging.Handler[] handlers = rootLogger.getHandlers();
    for (int i = 0; i < handlers.length; i++) {
      rootLogger.removeHandler(handlers[i]);
    }
    org.slf4j.bridge.SLF4JBridgeHandler.install();
  }
  public FooTest() {
    super("com.XXX");
  }
  @Test
  public void testSomething() throws Exception {
    // ...
  }
}

pom.xmlにはこれらの依存関係が含まれています:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.6.1</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.6.1</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jul-to-slf4j</artifactId>
  <version>1.6.1</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.16</version>
</dependency>

完全に機能しますが、すべての単体テストで同じ構成を作成したくありません。これは明らかなコードの重複であり、避けたいと思います。どうすればこれをより効果的に行うことができますか?

ps。おそらく、上記のコードを最適化することは不可能であり、私は最善を尽くしていますか?

4

6 に答える 6

20

クライアント API を使用している場合は、ログを手動で slf4j にリダイレクトできます (可能性は低いですが、将来のバージョンでは壊れる可能性があることに注意してください)。

Logger LOG = LoggerFactory.getLogger(MyClass.class); //slf4j logger

WebTarget ws = ClientBuilder.newClient(config)
                  .register(new LoggingFilter(new JulFacade(), true));

private static class JulFacade extends java.util.logging.Logger {
  JulFacade() { super("Jersey", null); }
  @Override public void info(String msg) { LOG.info(msg); }
}
于 2014-09-29T15:30:31.640 に答える
6

これを行う最善の方法は、カスタムListenerを使用することです。JSF サーブレットの前に初期化されているため、 で jul-to-slf4j ブリッジを構成する必要がありますcontextInitialized(ServletContextEvent)

于 2011-04-20T18:51:01.230 に答える
1

これは私のために働いた:

public abstract class JerseyTestSFL4J extends JerseyTest {

  static {
    // Get JerseyTest to use SLF4J instead of JUL
    SLF4JBridgeHandler.removeHandlersForRootLogger();
    SLF4JBridgeHandler.install();
  }
}

そして、テストを拡張しJerseyTestSFL4Jます。

于 2018-01-11T14:44:43.527 に答える
0

JUnit がテストを開始する前に JUL/SLF4J 構成ハンドルが必要なように聞こえるので、すべてのテストでカバーできますか? これを行う方法があります。

出力

MySuite.init()
MySuite()
getSuiteTests()
MyTest.init()
MyTest()
test()

コード

@RunWith(AbstractTestSuite.TestSuiteRunner.class)
public abstract class AbstractTestSuite {
   public static class TestSuiteRunner extends Suite {
      public TestSuiteRunner(Class<?> klass) throws Exception {
         super(klass, ((Class<? extends AbstractTestSuite>) klass).newInstance().getSuiteClasses());
      }
   }

   public Class<?>[] getSuiteClasses() {
      List<Class<?>> all = new ArrayList<Class<?>>();
      for (Class<?> testClass : getSuiteTests()) {
         all.add(testClass);
      }
      return all.toArray(new Class<?>[0]);
   }

   protected abstract Iterable<Class<?>> getSuiteTests();
}

public class MySuite extends AbstractTestSuite {
   public static class MyTest {
      static {
         System.out.println("MyTest.init()");
      }

      public MyTest() {
         System.out.println("MyTest()");
      }

      @Test
      public void test() {
         System.out.println("test()");
         assertTrue(true);
      }
   }

   static {
      System.out.println("MySuite.init()");
   }

   public MySuite() {
      System.out.println("MySuite()");
   }

   @Override
   protected Iterable<Class<?>> getSuiteTests() {
      System.out.println("getSuiteTests()");
      return Arrays.asList(new Class<?>[] {MyTest.class});
   }
}
于 2010-11-22T16:16:13.577 に答える