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

科林是对的,你有两种方法来处理你的错误:

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

于 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

这是您必须继续的两个选项。我才刚刚开始使用 gwt-test-utils,但主要前提是它不运行 GWT 编译器或开发模式,因此它需要其他方法来处理实现像 GWT.create 这样的“神奇”功能。它的方法是要么要求您模拟实例(这在您对涉及测试的其他对象的大多数测试中应该是一个相当普遍的想法),要么提供类似生成器的东西,并使用GwtTest.addGwtCreateHandler.

构建一个模拟记录器应该不会太糟糕,实现 GwtCreateHandler 也不应该 - 你只需要制作具有所有日志方法的东西。如果您希望日志记录正常工作,那么这些方法需要实际调用一些其他记录器,例如java.util.Loggerlog4j、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 回答