基类
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()
和其他函数。如果是,我是否应用了错误的模式?我应该如何处理相同的?
因为上面粘贴的代码不是真正的代码,所以诊断这一点变得更加困难。例如,测试需要“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 测试代码: 完整堆栈跟踪: