首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWTMockito UnsatisfiedLinkError

GWTMockito UnsatisfiedLinkError
EN

Stack Overflow用户
提问于 2014-10-10 22:00:01
回答 1查看 1.8K关注 0票数 5

我已经完成了我的大部分GWT测试MVP风格,没有测试小部件。我希望能够构建更复杂的小部件,并在不使用GwtTestCase (slow)的情况下很好地测试它们。

出于好奇,我尝试了一个非常简单的测试。给出一个非常简单的小部件,有点像这样(这不是我的确切类,只是一个简化的例子):

代码语言:javascript
复制
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测试有点像这样:

代码语言:javascript
复制
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();
    }

}

我立刻得到:

代码语言:javascript
复制
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,我得到:

代码语言:javascript
复制
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)

基于另一个堆栈溢出问题和快速调查,我倾向于认为这与在这个项目中使用的JUnit版本有关。GwtMockito使用BlockJunit4ClassRunner,标记为@从4.5开始。

那么我对GWTMockito完全陌生,所以这很容易成为一个简单的误解,但我很想理解。

我可以使用GWTMockito来测试使用Composite / IsWidget构建的由较小的小部件构建的复杂小部件吗?GWTMockito不应该帮助我解决这个JSNI问题,还是我误读了什么?仅仅是因为我没有使用测试跑者吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-12 11:04:45

在我看来,有两种可能性:

  1. 您忘记使用GwtMockito的JUnit运行程序: @RunWith(GwtMockitoTestRunner.class)公共类MyTest { // .} 如果需要自定义运行程序,则可以在GwtMockito中设置替代方式
  2. 您没有使用GWT.create实例化您的小部件。

第一点是直截了当的--这个跑步者是必需的,这样GwtMockito才能实现它的“魔力”。

第二点需要解释: GwtMockito通过使用GWT的延迟绑定工作。这意味着,您希望由GwtMockito自动模拟的所有小部件都必须通过调用GWT.create来实例化。对于UiBinder来说,这很简单--在内部,UiBinder模板中定义的所有小部件都是用GWT.create实例化的,所以您不需要更改任何东西就可以在GwtMockito中使用它。但是,如果您不使用UiBinder (或者providing是您自己的小部件实例),GwtMockito将无法运行它的魔力,除非您用GWT.create实例化您的小部件。

来自GwtMockito文件 (重点雷):

GwtMockito通过允许您从GWT.create调用JUnit测试,返回Mockito模拟,从而解决了这一问题和其他与GWT相关的测试问题。

更新

我可以验证,使用JUnit 4.4,运行程序正在抛出您提到的异常。我为此打开了一个关于GwtMockito追踪器的问题

至于测试本身,我已经设法让它开始工作了。正如我前面提到的,GwtMockito的工作得益于延迟绑定。这意味着,您的小部件必须使用GWT.create实例化--成员也是。这就是GwtMockito在你的小部件中的“方式”。如果您只调用new TextBox(),它将无法用模拟来代替它。

如果您将MyWidget类更改为以下内容,它将通过测试(注意对GWT.create的调用)。

代码语言:javascript
复制
public class MyWidget extends Composite {
    private TextBox boxOne, boxTwo;

    public MyWidget() {
        boxOne = GWT.create(TextBox.class);
        boxTwo = GWT.create(TextBox.class);
        VerticalPanel panel = GWT.create(VerticalPanel.class);
        panel.add( boxOne );
        panel.add( boxTwo );
        initWidget( panel );
    }

    public String[] getText() {
        return new String[] { boxOne.getText(), boxTwo.getText() };
    }
}

知道了这一点,有一些选择:

  • 始终记得用GWT.create实例化组合中的所有小部件
  • 将它们公开为可见包(按照在UiBinder中所做的方式),并在测试中分配模拟(由mockGWT.create创建)
  • 转到UiBinder ;/

没有一个看起来太有吸引力,第一个似乎是最好的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26308676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档