我有一个项目,其中包含分散在各处的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);
...
任何关于如何解决这个问题的线索都将非常感激!
答案 0 :(得分:2)
科林是对的,你有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
答案 1 :(得分: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等,但这不是让测试运行所必需的(但可能很方便制作确保你记录工作,或找出你的测试失败的原因。
答案 2 :(得分: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;
}
});
}