我正在处理遗留代码并尝试为我所做的实现编写单元测试。我有以下结构:
AbstractClass:
----------------
public AbstractClass {
abstract method2();
void method1(){
...does something...
..calls --> method2()
}
}
Subclass
------------
public Subclass extends AbstractClass(){
void method2(){
..do something....
..mockThisMethod()...
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个抽象类,它在特定方法中实现了一些逻辑。此方法调用比子类中实现的另一个方法。子类中的方法调用了我想模拟的其他方法。
在不更改实现代码(难以更改)的情况下这可能吗?大多数结果都建议使用模拟间谍,但它不起作用。
我在这里遵循了 TestDesign 描述:
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?)
Run Code Online (Sandbox Code Playgroud)
所以我想避免的是,调用方法(mockThisMethod中)Subclass。由于此方法会执行一些 db-stuff 等等。我知道如果我使用对象组合而不是继承会更容易测试,但在这一点上,很难改变整个实现。上面的代码不起作用..我得到了一个 NPE。