2012-04-20 91 views
2

我有一個項目,它的gwt-log記錄線分散在各處。現在我正在嘗試編寫一些單元測試,但似乎沒有任何工作。gwt-log和gwt-test-utils不能很好地玩在一起

使用GWT的日誌設施的任何I類測試會導致拋出以下異常:

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); 
... 

任何關於如何解決這個問題的線索將不勝感激!

回答

1

從錯誤消息,您發佈的評論:

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

這些都是你必須再進行兩個選項。我剛剛開始使用gwt-test-utils,但主要前提是它不運行GWT編譯器或開發模式,所以它需要其他方法來處理像GWT.create這樣的「魔術」功能。它的方法是要求你模擬實例(這在你測試中涉及的其他對象的大部分測試中應該是一個相當常見的想法),或者提供類似於生成器的東西,並且使用GwtTest.addGwtCreateHandler來掛鉤它。

構建一個模擬記錄器不應該太糟糕,也不應該實現GwtCreateHandler - 你只需要製作一些具有所有日誌方法的東西。如果你想讓日誌工作,那麼這些方法需要實際調用其他一些日誌記錄程序,如java.util.Logger,log4j,slf4j等,但這並不是僅僅需要運行測試所必需的(但對於確保日誌記錄可能很方便。作品,或找出爲什麼你的測試失敗

+0

科林,感謝您的答覆。我一定想嘲笑記錄器,但這個概念對我來說是全新的。請看我上面的編輯(當我拿到他們時),並確認我在正確的軌道上。 – holocron 2012-04-22 03:37:42

+0

gwt-log.jar中包含一個LogMessageFormatterGenerator.class文件...可以用來提供一個生成器嗎?如果是這樣,它是如何完成的? :)感謝科林,這是你第二次來拯救我 – holocron 2012-04-22 04:10:19

2

Colin是正確的,你有2種方式來處理你的錯誤:

1)嘲笑LogMessageFormatter,或在一個較高的水平,嘲笑你的Logger實例。 gwt-test-utils提供了一個簡單的API用於模擬Mockito或EasyMock: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

1

對於那些仍與這個該死的問題,這裏是我設法得到(有很多痛苦的太...)。它將解決Gwt-test-utilsGwt-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; 
     } 
    }); 
} 
相關問題