gpt4 book ai didi

java - 如何初始化一个真实类的模拟

转载 作者:行者123 更新时间:2023-11-30 09:29:54 26 4
gpt4 key购买 nike

我想在 TestNG 测试用例中模拟一个具体类。该类可能如下所示(简化示例):

public class Example() {

private MyHello myHello;

public Example(MyHello myHello) {
this.myHello = myHello;
}

public String doSomething() {
return myHello.doSomethingElse();
}
}

现在我们要模拟 Example 返回一些定义的值:

@BeforeMethod
public void setUp() {
this.example = mock(Example.class);
when(this.example.doSomething()).thenReturn("dummyValue");
}

看起来 相当不错,但实际上并非如此。 setup 方法的最后一行调用 Example 实例上的方法,这个实例没有通过构造函数获得 MyHello,所以我在 setUp 中得到了一个 NPE方法。

有没有办法在创建模拟时注入(inject) MyHello 或禁止 Mockito 在 真实 实例上调用方法?

编辑

导致观察到的行为的问题是,doSomething() 方法实际上是 final。当我试图解决这个问题时,我忽略了这一点。 And this is a known limitation with mockito anyway .因此,我将删除 final 或提取该类的接口(interface)。

最佳答案

看看使用 doReturn("dummy").when(example).doSomething() 是否有效。

Mockito.doReturn

来自 JavaDoc:

Use doReturn() in those rare occasions when you cannot use when(Object). Beware that when(Object) is always recommended for stubbing because it is argument type-safe and more readable (especially when stubbing consecutive calls).

Here are those rare occasions when doReturn() comes handy:

  1. When spying real objects and calling real methods on a spy brings side effects

    List list = new LinkedList();

    List spy = spy(list);

    //Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty) when(spy.get(0)).thenReturn("foo");

    //You have to use doReturn() for stubbing: doReturn("foo").when(spy).get(0);

关于java - 如何初始化一个真实类的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13472392/

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