2

gwt-log ロギング行が散らばっているプロジェクトがあります。現在、いくつかの単体テストを作成しようとしていますが、何も機能していないようです。

gwt-log 機能を使用するクラスをテストすると、次の例外が発生します。

Caused by: com.googlecode.gwt.test.exceptions.GwtTestConfigurationException: 
A custom Generator should be used to instanciate 
'com.allen_sauer.gwt.log.client.LogMessageFormatter', 
but gwt-test-utils does not support GWT compiler API, 
so you have to add our own GwtCreateHandler with 
'GwtTest.addGwtCreateHandler(..)' method or to declare your 
tested object with @Mock

単体テスト中にロガーが機能する必要はありません。私はそれをモックしたいと思います。いくつかの異なる方法で、Mockito を使用してロガーをモックしようとしました...明らかに、ここで何をしているのかわかりません。次のコード スニペットはどれも状況を助けませんでした:

public class ClockTest extends GwtTest {
    @Mock private LogMessageFormatter lmf;
...

また

...
@Before
public void init() throws Exception {
    LogMessageFormatter lmf = mock(LogMessageFormatter.class);
...

これを解決する方法についての手がかりをいただければ幸いです。

4

3 に答える 3

2

Colin は正しいです。エラーに対処するには 2 つの方法があります。

1) LogMessageFormatter をモックするか、より高いレベルで Logger インスタンスをモックします。gwt-test-utils は、Mockito または EasyMock の両方でモックするためのシンプルな API を提供します: http://code.google.com/p/gwt-test-utils/wiki/MockingClasses

2) 独自の GwtCreateHandler を提供して、LogMessageFormatter をインスタンス化するか、さらに独自の Logger インスタンスを提供します。内部的には、gwt-log は GWT の遅延バインディングに依存して、コンパイル時に解析される設定に基づいて LogMessageFormatter オブジェクトをインスタンス化します。GWT のジェネレーター API を使用して LogMessageFormatter クラスを作成しますが、gwt-test-utils はそのようなジェネレーターを使用できません。gwt-test-utils 遅延バインディング サポート: GwtCreateHandlers を使用して、「手動で」実行する必要があります。「LoggerGwtCreateHandler」は、JDK の InvocationHandler および Proxy クラスを使用して、Logger インターフェイスのプロキシを記述できます。これは、テストでのログ呼び出しを気にしないと思われるため、各メソッド呼び出しを単純にサイレントにします。

GwtCreateHandler の作成方法に関するディスカッションは次のとおりです: https://groups.google.com/forum/?fromgroups#!topic/gwt-test-utils-users/r_cbPsw9nIE

于 2012-04-22T16:27:09.307 に答える
1

あなたが投稿したエラーメッセージから:

you have to add our own GwtCreateHandler with 
'GwtTest.addGwtCreateHandler(..)' method or to declare your 
tested object with @Mock

これらは、続行する必要がある 2 つのオプションです。私は gwt-test-utils を使い始めたばかりですが、GWT コンパイラーや開発モードを実行しないことが大前提であるため、GWT.create などの「魔法の」機能の実装を処理するには他の方法が必要です。その方法は、インスタンスをモックすることを要求するか (これは、テストに関与する他のオブジェクトのほとんどのテストでかなり一般的なアイデアです)、またはジェネレーターのようなものを提供し、 を使用して接続することGwtTest.addGwtCreateHandlerです。

モック ロガーを作成することはそれほど悪くないはずです。また、GwtCreateHandler を実装する必要もあります。すべてのログ メソッドを備えたものを作成する必要があるだけです。ロギングを機能させたい場合は、これらのメソッドでjava.util.Logger、log4j、slf4j などの他のロガーを実際に呼び出す必要がありますが、テストを実行するだけでは必要ありません (ただし、ロギングが機能することを確認するのに便利な場合があります)。 、またはテストが失敗する理由を見つけます。

于 2012-04-21T18:23:19.940 に答える
1

このいまいましい問題にまだ苦しんでいる人のために、ここに私がなんとか手に入れたものがあります(多くの痛みもありました...)。Gwt-test-utilsとの間の競合を解決しますGwt-log

もちろん、formatメソッドを変更することは大歓迎です ;) :

@Before
public void correctLog() {
    this.addGwtCreateHandler(new GwtCreateHandler() {
        @Override
        public Object create(Class<?> classLiteral) throws Exception {
            if (classLiteral.isAssignableFrom(LogMessageFormatter.class)) {
                return new LogMessageFormatter() {
                    @Override
                    public String format(String logLevelText, String category,
                            String message, Throwable throwable) {
                        return message + " : " + throwable.getLocalizedMessage();
                    }
                };
            }
            return null;
        }
    });
}
于 2012-06-19T16:39:45.360 に答える