1

ロギングと単体テストについて助けが必要です。テスト対象のクラスは ZkGenericForwardComposerであり、具体的なログとログの構成をテストから除外したいと考えています。私は一種のTDDに従っており、ロギングのためにテストに失敗しました。テスト中のクラスとテストを投稿しました。私のテストにはlog4jの構成がありません。これは、ユニットテストをできるだけ純粋に、できるだけシンプルにしたいからです。


テストの失敗:

log4j:ERROR setFile(null,true) call failed.
    java.io.FileNotFoundException: /log/t2-console.log (No such file or directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:136)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:207)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:295)
    at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:176)
    at org. apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:191)
    at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:523)
    at org.apache.log4j.xml.DOMConfigurator.parseCategory(DOMConfigurator.java:436)
    at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:1004)
    at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:872)
    at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:778)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.apache.log4j.Logger.getLogger(Logger.java:117)
    at com.t2.integration.controller.IntegrationSearchController.<clinit>(IntegrationSearchController.java:60)
    at com.t2.integration.controller.IntegrationSearchControllerTest.doesSomeCalling(IntegrationSearchControllerTest.java:14)


Log4j の単体テストを構成していないため、Red-Green-Refactorに従いたいと考えています。テストでロギング呼び出しを処理できると思いますが、可能であればロギングを完全に除外する方法を見つけたいと考えています。

public class IntegrationSearchControllerTest {

    @Test
    public void doesSomeCalling() {
        IntegrationSearchController searchController = new IntegrationSearchController();
    }
}

ZK コンテキストまたは ZK 統合テスト コンポーネントが単体テストに漏れることは望ましくありません。そして、私はテストをできるだけシンプルにしたいと考えています。AOP、インターフェース、依存性注入、またはリファクタリングですか?

テスト中のクラス:

package ...

import org.apache.log4j.Logger;

public class IntegrationSearchController extends IntegrationBaseController {

   private static final Logger LOGGER = Logger.getLogger(IntegrationSearchController.class);
...

コントローラは ZK 管理です

4

1 に答える 1

2

あなたLoggerは静的(通常)であるため、静的をモックできるモックフレームワークを使用する必要があります。これを行うのははるかに困難です (フレームワークの観点からすると、通常はバイト コードの操作が必要になります)。とにかくそれは行われ、あなたにはオプションがあります。

Mockito で PowerMockを使用すると、次のようになります。

@RunWith(PowerMockRunner.class)
@PrepareForTest(Logger.class)
public class TestIntegrationSearchController {

    @Before
    public void initMockLogger() {
        mockStatic(Logger.class);
        when(Logger.getLogger(any(Class.class))).thenReturn(mock(Logger.class));
    }

    @Test
    public void test() {
        IntegrationSearchController controller = new IntegrationSearchController();
        // controller.LOGGER is a Mockito mocked Logger
    }

}

注: でモッキングを設定する必要はありませんが、@Before読みやすいと思います。

さて..そうは言っても、ここで間違った問題を解決していると思います。すべてのテストでロギングをモックするのではなく、必要性を排除する代替手段を検討してください。たとえば、にログを記録するテストで別の Log4J 構成を使用STDOUTできます。

于 2013-08-15T21:00:37.747 に答える