java Mockito mock子类方法调用
我正在处理遗留代码,并试图为我所做的实现编写一个单元测试。我的结构如下:
AbstractClass:
----------------
public AbstractClass {
abstract method2();
void method1(){
...does something...
..calls --> method2()
}
}
Subclass
------------
public Subclass extends AbstractClass(){
void method2(){
..do something....
..mockThisMethod()...
return true;
}
}
我有一个抽象类,它用特定的方法实现了一些逻辑。 此方法调用的方法比子类中实现的另一个方法调用的方法多。子类中的方法调用我想要模拟的其他方法
在不改变实现代码(难以改变)的情况下,这是可能的吗? 大多数研究结果都建议使用mockito间谍技术,但并不奏效
我遵循了这里的测试设计描述:
https://www.tildedave.com/2011/03/06/pattern-stubbing-legacy-superclasses-with-mockito-spies.html
我所做的是:
Subclass subclass= spy(Subclass.class);
when(subclass.mockThisMethod()).thenReturn(something);
subclass.method1() (I am not sure if this line is correct?)
所以我想要避免的是,在Subclass
中调用方法(mockThisMethod
)。
因为这个方法做了一些数据库之类的事情。我知道如果我使用对象组合而不是继承,测试会更容易,但在这一点上,很难改变整个实现。上面的代码不起作用。。我有一个NPE
# 1 楼答案
1)将类传递给静态
Mockito.spy
方法不会创建间谍。 相反,您必须传递该特定类的实例:也可以考虑使用注释:
2)在刺杀间谍时避免使用
when.thenReturn
。 相反,使用doReturn..when..methodCall
:否则,在存根时将调用实际方法,这可能会导致不必要的行为和/或异常