【发布时间】:2014-10-10 22:00:01
【问题描述】:
我已经完成了我的大部分 GWT 测试 MVP 风格,没有测试小部件。我希望能够构建更复杂的小部件并在不使用GwtTestCase(慢)的情况下很好地测试它们。
出于好奇,我尝试了一个非常简单的测试。给定一个非常简单的小部件,有点像这样(这不是我的确切类,只是一个简化的示例):
public class MyWidget extends Composite {
private TextBox boxOne, boxTwo;
public MyWidget() {
boxOne = new TextBox();
boxTwo = new TextBox();
VerticalPanel panel = new VerticalPanel();
panel.add( boxOne );
panel.add( boxTwo );
initWidget( panel );
}
public String[] getText() {
return new String[] { boxOne.getText(), boxTwo.getText() }
}
}
我正在使用 GWTMockito 测试,有点像这样:
public class MyWidgetTest {
private ConstantsWithLookup constants;
private MyWidget widget;
@Before
public void createMocks() {
GwtMockito.initMocks( this );
constants = mock( ConstantsWithLookup.class );
}
@Test
public void testIsInvalidByDefault() {
widget = new MyWidget( constants ) {
protected void initWidget(Widget w) {
// Disarm for testing
}
};
assertNotNull( widget );
}
@After
public void tearDown() {
GwtMockito.tearDown();
}
}
我立刻明白了:
java.lang.UnsatisfiedLinkError: com.google.gwt.dom.client.Document.nativeGet()Lcom/google/gwt/dom/client/Document;
at com.google.gwt.dom.client.Document.nativeGet(Native Method)
at com.google.gwt.dom.client.Document.get(Document.java:46)
at com.google.gwt.user.client.ui.TextBox.<init>(TextBox.java:78)
at mypackage.MyWidget.<init>(MyWidget.java:linenumber)
... etc ...
您会注意到我没有使用测试运行器——我尝试过,但我正在测试它的项目使用的是 JUnit 4.4,测试运行器似乎不适用于 JUnit 4.4。如果我使用 GwtMockitoTestRunner,我会得到:
java.lang.NoSuchFieldError: NULL
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:57)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:57)
at com.google.gwtmockito.GwtMockitoTestRunner.<init>(GwtMockitoTestRunner.java:114)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
基于another stack overflow question 和快速调查,我倾向于认为这与此项目中使用的 JUnit 版本有关。 GwtMockito 使用BlockJunit4ClassRunner,它被标记为@since 4.5。
那么——这个测试是 GWTMockito 应该帮助的吗?我对 GWTMockito 完全陌生,所以这很容易成为一个简单的误解,但我想理解。
我可以使用 GWTMockito 来测试使用 Composite / IsWidget 的较小小部件构建的复杂小部件吗? GWTMockito 不应该帮助我解决这个 JSNI 问题,还是我误读了什么?只是因为我没有使用测试运行器吗?
【问题讨论】:
-
你能发布失败的测试吗?你确定你使用的是
GwtMockitoTestRunner? -
嗨@Wiseman 你能解决这个问题吗?
-
我已经太久记不住细节了——尽管我知道有问题的项目最终没有采用 GwtMockito。这是否是因为我没有找到让我对
GwtMockito感到满意的东西,都已经消失在时间的迷雾中。 ;)
标签: gwt mocking gwtmockito