Java gwt日志和gwt测试UTIL不能很好地结合在一起

Java gwt日志和gwt测试UTIL不能很好地结合在一起,java,unit-testing,gwt,junit,gwttestcase,Java,Unit Testing,Gwt,Junit,Gwttestcase,我有一个项目,其中gwt日志记录线分散在各处。现在,我正试图编写一些单元测试,但似乎什么都不起作用 任何使用gwt日志功能的I级测试都会引发以下异常: Caused by: com.googlecode.gwt.test.exceptions.GwtTestConfigurationException: A custom Generator should be used to instanciate 'com.allen_sauer.gwt.log.client.LogMessageForm

我有一个项目,其中gwt日志记录线分散在各处。现在,我正试图编写一些单元测试,但似乎什么都不起作用

任何使用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;
...


任何关于如何解决这个问题的线索都将不胜感激

来自您发布的错误消息:

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


构建一个模拟记录器不应该太糟糕,实现GwtCreateHandler也不应该太糟糕——您只需要制作一些包含所有日志方法的东西。如果您希望日志记录工作,那么这些方法实际上需要调用其他一些记录器,如
java.util.logger
、log4j、slf4j等,但这并不是运行测试所必需的(但可能有助于确保日志记录正常工作,或找出测试失败的原因。

从您发布的错误消息中:

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


构建一个模拟记录器不应该太糟糕,实现GwtCreateHandler也不应该太糟糕——你只需要制作一些包含所有日志方法的东西。如果你想让日志工作,那么这些方法实际上需要调用一些其他记录器,比如
java.util.logger
、log4j、slf4j等,但这并不是获取要运行EST(但可能有助于确保日志记录正常工作,或找出测试失败的原因。

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

1) 模拟LogMessageFormatter,或者在更高的级别上模拟您的记录器实例。gwt test utils提供了一个简单的API,用于使用Mockito或EasyMock进行模拟:

2) 提供您自己的GwtCreateHandler来实例化LogMessageFormatter,或者在更高级别上提供您自己的Logger实例。 在内部,gwt log依赖gwt的延迟绑定,根据您的配置实例化LogMessageFormatter对象,该对象在编译时进行解析。它使用gwt的生成器API创建LogMessageFormatter类,但gwt test utils无法使用此类生成器。 您必须“手动”完成,并使用gwt测试utils延迟绑定支持:GwtCreateHandlers。 您的“LoggerGwtCreateHandler”可以使用JDK的InvocationHandler和Proxy类为记录器接口编写一个代理,该代理只会使每个方法调用静音,因为我猜您不会关心测试中的任何日志调用


下面是关于如何编写GwtCreateHandler的讨论:

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

1) 模拟LogMessageFormatter,或者在更高的级别上模拟您的记录器实例。gwt test utils提供了一个简单的API,用于使用Mockito或EasyMock进行模拟:

2) 提供您自己的GwtCreateHandler来实例化LogMessageFormatter,或者在更高级别上提供您自己的Logger实例。 在内部,gwt日志依赖于gwt的延迟绑定来根据您的配置实例化LogMessageFormatter对象,该配置在编译时解析。它使用GWT的生成器API来创建LogMessageFormatter类,但GWT test utils无法使用这些生成器。 您必须“手动”完成,并使用gwt测试utils延迟绑定支持:GwtCreateHandlers。 您的“LoggerGwtCreateHandler”可以使用JDK的InvocationHandler和Proxy类为记录器接口编写一个代理,该代理只会使每个方法调用静音,因为我猜您不会关心测试中的任何日志调用


下面是一个关于如何编写GwtCreateHandler的讨论:

对于那些仍然为这个该死的问题感到痛苦的人,这里是我设法得到的(也非常痛苦…)。它将解决
gwttestutils
gwtlog
之间的冲突

当然,欢迎您修改
格式
方法;):

@之前
公共日志(){
this.addGwtCreateHandler(新的GwtCreateHandler(){
@凌驾
公共对象创建(类classLiteral)引发异常{
if(classLiteral.isAssignableFrom(LogMessageFormatter.class)){
返回新的LogMessageFormatter(){
@凌驾
公共字符串格式(字符串logLevelText、字符串类别、,
字符串消息,可丢弃可丢弃){
返回消息+”:“+throwable.getLocalizedMessage();
}
};
}
返回null;
}
});
}

对于那些仍然因为这个该死的问题而感到痛苦的人,这里是我设法得到的(也很痛苦…)。它将解决
gwttestutils
gwtlog
之间的冲突

当然欢迎您修改... @Before public void init() throws Exception { LogMessageFormatter lmf = mock(LogMessageFormatter.class); ...
you have to add our own GwtCreateHandler with 
'GwtTest.addGwtCreateHandler(..)' method or to declare your 
tested object with @Mock
@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;
        }
    });
}