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

如何用Mockito覆盖抽象基类行为

胡和煦
2023-03-14

我有这样的代码:

class Outer {
  private External external;
  class MyCallback extends ExternalAbstractCallback {
    void somethingHappened() { if (super.someCondition()) { ... }; }
  }

  public Outer() {
     external = ...;
  }

  public setExternal(External e) { external = e; } // test support

  public void doIt() {
    external.setCallback(new MyCallback());
    external.doSomething();
  }
}

我想在调用doIt()时测试MyCallback的行为。我使用Mockito创建一个模拟外部,然后可以获取外部。doSomething()来执行MyCallback。发生了什么事。我可以控制调用super的返回值吗。第4行的某个条件?我可以重新安排实现以提高可测试性吗?无法更改外部回调和外部抽象回调的实现。

共有1个答案

濮阳和泰
2023-03-14

您的问题是您无法使用Mockito模拟new。简而言之,您要测试的代码永远不应该调用new

解决方法:

  • 为回调添加一个getter/setter。
  • new MyCallback()移动到一个新的受保护的辅助方法中,您可以在测试中覆盖该方法
 类似资料:
  • 问题内容: 我有一个抽象类,应该实现一个公共字段,该字段是一个接口或另一个抽象类。 像这样的东西: 现在我有另一个专门的类容器: Java的让我编译这个,和我想象的领域中被自动重载领域的......这些问题是:我是对这个?孩子的自动“超载”会发生吗? 而且,更重要的问题是,如果我还有另一个这样的课: 会返回1还是2?我的意思是容器字段将称为通用字段还是特殊字段?还有,如果特殊的prop1被声明为S

  • 问题内容: 我有一些看起来像这样的代码: 并且我想覆盖模型中字段的默认值,使其适用于该模型。 我已经浏览了一些相关的Django文档,并仔细查看了模型对象,但是我很难找到合适的位置进行此操作。有什么建议? 问题答案: 你实际上可以按照以下步骤进行操作: 我已经做了一两次。之所以有效,是因为Message上的字段与BaseMessage上的字段是不同的实例。但是,我怀疑是否建议使用它;-)它在很大程

  • 我得到了tasteScore值=7.0。它的意思是double(超级类),但我想打印tastescore的int值。如何访问Bread类tasteScore而不是Food类?

  • 我刚刚开始使用抽象类,重写val和singeltons。但是,我刚刚遇到了一个非常奇怪的行为。我的目标是拥有一个抽象类,然后创建几个扩展该抽象类的singeltons。因为我需要某些变量,所以我创建了抽象val,然后可以在子类中覆盖它(而不是通过构造函数传递它们)。 所以我上了4节课: 主要活动: 实例: 对象 AClass: 输出: 在此之后,我意识到被覆盖可能直到执行 之后才会初始化。但后来我

  • 问题内容: 因此,我一直在为编程类编写抽象作业,但遇到了问题。我现在的目标是能够使用抽象,然后能够使用矩形和椭圆形绘制一个简单的城市,例如矩形建筑物或灯柱上的椭圆形灯。 我在编译时收到的错误是:MyTestApp.Rectangle不是抽象的,并且不会覆盖MyTestApp.Shape中的抽象方法drawEllipse(java.awt.Graphics)。该错误显示在类Shape下方的“矩形扩展

  • 问题内容: 这是代码: 问题:代码可以编译并且一切正常。我想知道类Hello中的meth1()是否覆盖了哪个meth1()?接口中的ont或抽象类中的ont,为什么? 问题答案: 答案很简短:两者..... 实际上,是正确的:您不会 覆盖 任何一个,而是使用一种方法来 实现 它们两者。