Nor*_*t94 4 java unit-testing mockito
我正在处理遗留代码并尝试为我所做的实现编写单元测试。我有以下结构:
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。
1)您不会通过将类传递给静态Mockito.spy方法来创建 Spy 。相反,您必须传递该特定类的实例:
Subclass subclassSpy = spy(new Subclass());
Run Code Online (Sandbox Code Playgroud)
另外,请考虑使用注释:
@Spy
private Subclass subclassSpy = new Sublcass();
@Before
public void init(){
MockitoAnnotations.initMocks(this);
}
Run Code Online (Sandbox Code Playgroud)
2)避免when.thenReturn在存根间谍时使用。相反,使用doReturn..when..methodCall:
doReturn(something).when(sublcass).mockThisMethod();
Run Code Online (Sandbox Code Playgroud)
否则,您将在存根时调用实际方法,这可能会导致不需要的行为和/或异常。