gpt4 book ai didi

java - Mockito - 使用本地方法模拟类

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:32 26 4
gpt4 key购买 nike

我有一个简单的测试用例:

@Test
public void test() throws Exception{
TableElement table = mock(TableElement.class);
table.insertRow(0);
}

其中 TableElement 是 GWT 类,方法 insertRow 定义为:

public final native TableRowElement insertRow(int index);

当我启动测试时,我得到:

java.lang.UnsatisfiedLinkError: com.google.gwt.dom.client.TableElement.insertRow(I)Lcom/google/gwt/dom/client/TableRowElement;
at com.google.gwt.dom.client.TableElement.insertRow(Native Method)

我认为这与 insertRow 方法是原生的有关。有什么方法或解决方法可以使用 Mockito 模拟此类方法吗?

最佳答案

Mockito 本身似乎无法根据此 Google Group thread 模拟 native 方法.但是,您有两个选择:

  1. TableElement 类包装在一个接口(interface)中并模拟该接口(interface)以正确测试您的 SUT 是否调用包装的 insertRow(...) 方法。缺点是您需要添加额外的接口(interface)(当 GWT 项目应该在他们自己的 API 中完成此操作时)以及使用它的开销。接口(interface)代码和具体实现如下所示:

    // the mockable interface
    public interface ITableElementWrapper {
    public void insertRow(int index);
    }

    // the concrete implementation that you'll be using
    public class TableElementWrapper implements ITableElementWrapper {
    TableElement wrapped;

    public TableElementWrapper(TableElement te) {
    this.wrapped = te;
    }

    public void insertRow(int index) {
    wrapped.insertRow(index);
    }
    }

    // the factory that your SUT should be injected with and be
    // using to wrap the table element with
    public interface IGwtWrapperFactory {
    public ITableElementWrapper wrap(TableElement te);
    }

    public class GwtWrapperFactory implements IGwtWrapperFactory {
    public ITableElementWrapper wrap(TableElement te) {
    return new TableElementWrapper(te);
    }
    }
  2. 使用Powermock它是 Mockito API extension调用 PowerMockito 来模拟本地方法。缺点是您有另一个依赖项要加载到您的测试项目中(我知道这可能是某些组织的问题,在这些组织中必须首先审核第 3 方库才能使用)。

就我个人而言,我会选择选项 2,因为 GWT 项目不太可能将它们自己的类包装在接口(interface)中(而且它们更有可能有更多需要模拟的 native 方法)并且为你自己做它只是为了包装本地方法调用只是在浪费您的时间。

关于java - Mockito - 使用本地方法模拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10223698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com