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

Mockito模拟超类调用

孔鸿哲
2023-03-14

基类

class BaseSplitter{
    public int splitSalaryHalf(String personName,int Salary){
        //check if person is employee
        //check is person eligible
        //some more check if yes
        //split salary into salary/2 else return -1
        return salary/2 or -1
    }
    public int abc(){
    }
}
class Bonus extends BaseSplitter{
    public int giveBonous(String personName,int salary){
        int bonusamount = super.splitsalaryHalf("Sunil",super.splitSalary("Sunil",salary));
        if(bonusamount == -1){
            return 0;
        }
        return Salary + bonusamount
    }
}
public class Bonus {

    @Test
    public void giveBonous() throws Exception{
        GiveBonus bonus = Mockito.spy(new Bonus);
        doReturn(500).when((BaseSplitter)Bonus).splitSalaryHalf("sunil",2000);
        int num = bonus.giveBonus("sunil",2000);
        assertEqual(2500,num);
    }
}

在派生类中不应用组合abc()和其他函数。如果是,我是否应用了错误的模式?我应该如何处理相同的?

共有1个答案

赵鸿畴
2023-03-14

因为上面粘贴的代码不是真正的代码,所以诊断这一点变得更加困难。例如,测试需要“sunil”,但实际代码使用“sunil”。这说明了复制准确代码并粘贴到问题中的重要性。

我认为实际答案与super关键字的使用有关。如果从代码示例中删除super关键字,它将按预期工作。

Mockito正在创建类似于原始对象的动态代理的东西,并在创建间谍时包装它。真正的对象仍然在那里,对giveBonous()的调用由间谍代理委托给真正的对象。

public class BonusCalculator {
  private double bonusFactor = 0.10;

  public int giveBonus(Employee employee) {
    return employee.getSalary() * bonusFactor;
  }
}

public class AuditableBonusCalculator extends BonusCalculator {
  public int giveBonus(String name, int salary) {
    int bonus = super.giveBonus(name, salary);
    updatePayrollAudit(employee, bonus);
    return bonus;
  }
}

子类AuditableBonusCalculator委托超类获取实际奖金金额,但增加了更新薪资审核系统以显示奖金已支付的责任。

Mockito只使用代理包装子类,并且只能拦截对特定类的调用。您仍然可以模拟由超类实现的方法,只要调用是通过代理调度的,如果super关键字不存在,它就会这样做。但是如果您使用super关键字,Java显式地不考虑当前对象的实现,它将查找该方法的超类实现并显式地调用它。

 类似资料:
  • 问题内容: 我在某些测试中使用Mockito。 我有以下课程: 我只想模拟的第二个调用。第一次调用必须调用real方法。有没有办法做到这一点? 问题答案: Mockito不支持此功能。 这可能不是你要寻找的答案,但是你看到的是不采用设计原则的症状: 偏重于继承而不是继承 如果你提取策略而不是扩展超类,那么问题就不存在了。 但是,如果不允许你更改代码,但无论如何都必须对其进行测试,并且以这种尴尬的方

  • 因为MyFinalClass中的getObject(字符串名)方法的实现尚未完成,所以我在调用getObject方法时抛出新的MyException()。但是,该异常不会作为mockito.when(...)调用未被调用,导致断言失败。 请帮帮忙。谢谢你。

  • 我正在将Powermock从我目前正在进行的项目中移除,因此我试图仅用Mockito(Mockito-Core-2.2.28)重写一些现有的unitary测试。 无法模拟/Spy类Com.ExternalPackagePath.ExternalClass Mockito无法模仿/监视,因为: 最终类 正如Mockito文档(https://github.com/Mockito/Mockito/wi

  • 我试图模拟一个公共类,但是当这样做时,Mockito抛出一个异常。 我想嘲弄的班级:https://github.com/scribejava/scribejava/blob/master/scribejava-core/src/main/java/com/github/scribejava/core/builder/ServiceBuilder.java 测试代码: 完整堆栈跟踪: