我正在使用遗留代码并尝试为我所做的实现编写单元测试。我有以下结构:
AbstractClass:
----------------
public AbstractClass {
abstract method2();
void method1(){
...does something...
..calls --> method2()
}
}
Subclass
------------
public Subclass extends AbstractClass(){
void method2(){
..do something....
..mockThisMethod()...
return true;
}
}
我有一个抽象类,它有一些在特定方法中实现的逻辑。 此方法调用子类中实现的另一个方法。子类中的方法调用我想模拟的其他方法。
这是否可以在不更改实现代码的情况下实现(很难更改)? 大多数结果都建议使用 mockito spy ,但它不起作用。
我在这里遵循了 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?)
所以我想避免的是,调用 Subclass
中的方法 (mockThisMethod
)。
由于此方法执行一些 db-stuff 等等。我知道如果我使用对象组合而不是继承会更容易测试,但在这一点上,很难改变整个实现。上面的代码不工作..我得到一个 NPE。
最佳答案
1) 您不会通过将类传递给静态 Mockito.spy
方法来创建 Spy。
相反,您必须传递该特定类的实例:
Subclass subclassSpy = spy(new Subclass());
另外,考虑使用注解:
@Spy
private Subclass subclassSpy = new Sublcass();
@Before
public void init(){
MockitoAnnotations.initMocks(this);
}
2) 阻止 spy 时避免使用 when.thenReturn
。
相反,使用 doReturn..when..methodCall
:
doReturn(something).when(sublcass).mockThisMethod();
否则您将在 stub 时调用实际方法,这可能会导致不需要的行为和/或异常。
关于java - Mockito - 模拟子类方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47264811/