当前位置: 首页 > 知识库问答 >
问题:

Mockito:当任何实例调用方法时,都会返回一些内容

秦珂
2023-03-14

我对Mockito很陌生,有一门课

public class A {
   private B b;
   public B getB() { return b; }
   // ...
}

public class B {
   private C c;
   public C getC() { return c; }
   // ...
}

我正在使用Mockito为A类编写单元测试,并试图实现以下行为,其中B是一个模拟:

when(a.getB().getC()).thenReturn(mock(C.class))
when(any(mock(C.class)).doSomething()).thenReturn("somethingElse") // This doesn't work.

当任何模拟的C实例调用doSomething()时,如何返回“somethingElse”?我不想将此行为绑定到任何一个特定的mock(C.class)实例。

共有2个答案

柯瀚海
2023-03-14

不要添加用于创建新模拟的mock()。

就像这样

when(any(C.class).doSomething()).thenReturn("somethingElse");
萧树
2023-03-14

首先,你必须把你的测试对象作为一个单元来对待,并模仿其他一切。因此,既然您正在测试类A,就不能模拟As方法。

下面是如何使用Mockito使用注释来模拟B的实例:

@MockitoSettings
public class ATest {
  @Mock
  private B b;
  @InjectMocks
  private A a;

  @Test
  void testExample() {
    C c = mock(C.class):
    when(b.getC()).thenReturn(c);
    when(c.doSomething()).thenReturn("somethingElse");
    
    // a.getB() == b
  }
}

那么这里发生了什么?

注释@Mock初始化类型为B的模拟对象,并将字段变量B设置为该对象。

@InjectMocks正在收集所有@Mock字段并设置对象中的字段。这是你的测试对象。

现在,您的A实例有一个模拟的B对象。在B中,你有C。因为B是一个模拟对象,所以方法getC()根本不做任何事情。你必须用一些功能来存根。在测试中,我初始化了一个本地模拟的C实例,从getC()返回。

所以现在当A对象访问模拟的B并获取C时,它将获取这个局部变量C。所以你可以用模拟函数来存根这个对象。

 类似资料:
  • 问题内容: 通常,当我调用getGraphics()时,即使我设置了xxx.getGraphics();它也返回null。xxx可见(如Google搜索所示…) 但这是行不通的,这使我感到沮丧,因为它在C-Sharp中很容易实现。 有谁知道这样做的更好方法,而不是使用getGraphics()? 问题答案: 您通常不希望在Java Swing组件上使用getGraphics,因为如果尚未渲染该组件

  • 问题内容: 是否有一种方法可以使每次调用方法时都会被调用的“超级方法”,即使对于未定义的方法也是如此?有点像这样: 编辑- 细节:我有一个库,该库进行了很多更新,并且每次更新都变得晦涩难懂。为了简化我的工作流程,我正在使程序自动更新库(需要执行我想做的事情,我不会具体说明原因,但是我的程序可以与将来的更新一起使用)并且我有混淆映射与库一起下载时,我想制作一种例如称为的代理,然后在我调用它时,将获得

  • 我有一个类,它有两个方法。我想模拟这个类,然后模拟第一个方法,但不是第二个。 例如。 单元测试代码: 奇怪的是m2没有被调用。 我错过什么了吗?

  • 问题内容: 使用模拟编写单元测试时遇到问题。我需要模拟的对象有很多吸气剂,我确实在代码中称呼它们。但是,这些不是我的单元测试的目的。因此,有一种方法可以模拟所有方法,而不是一个个地模拟它们。 这是代码示例: 这是我需要测试的服务等级 在测试类中,测试方法就像 因此,有一种方法可以避免将所有无用的“ field1”的“ when”写入“ field20” 问题答案: 您可以控制模拟的默认答案。在创建

  • 我在用Mock编写单元测试时遇到了一个问题。有一个对象,我需要模拟有很多getter,我在代码中调用它们。但是,这些不是我的单元测试的目的。所以,有没有一种方法我可以模拟所有的方法,而不是一个一个地模拟它们。 下面是代码示例: 那么,有没有一种方法可以避免为无用的“field1”到“field20”写所有的“when”

  • 主课 工具类 考试班 输出: 我试图嘲笑util无效的方法调用与do没什么,但不工作。有人能帮我解决吗?我在我们的应用程序中遇到了类似的功能。