GWT-log和GWT-test-utils不能很好地结合在一起



我有一个项目,它的gwt日志行分散在整个地方。 现在我正在尝试编写一些单元测试,但似乎没有任何效果。

任何使用 gwt-log 工具的 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);
...
有关如何

解决此问题的任何线索将不胜感激!

> Colin 是对的,您有两种方法可以处理您的错误:

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:

从您发布的错误消息中:

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等,但这不仅仅是让测试运行所必需的(但对于确保日志记录工作或找出测试失败的原因可能很方便。

对于那些仍然对这个该死的问题感到痛苦的人来说,这就是我设法得到的(也有很多痛苦......它将解决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;
        }
    });
}

最新更新