[英]Test if another method is called from a class using JUnit or Mockito
[英]Test an overridden method of an inner class with JUnit and Mockito
我在需要測試的類中有一個方法。 該方法使用我需要模擬的外部類,因此不會對外部類進行測試或執行其依賴項。 特殊的挑戰是:外部類的一種方法被覆蓋。 方法如下所示:
public void fetchLocalData(final String source, final ObservableEmitter<String> destination) {
final List<String> options = Arrays.asList("recursive","allFiles","includeDir");
// This class comes from a package
final DirScan dirscan = new DirScan(source, options) {
@Override
protected Action getResult(final String result) {
destination.onNext(result);
return Action.Continue;
}
};
dirscan.scan();
destination.onComplete();
}
我試過:
DirScan scanner = mock(DirScan.class);
when(scanner.scan()).thenReturn("one").thenReturn("two");
那沒有用。 我想念什么? 我需要如何重構才能使其可測試?
如果你想用模擬(或間諜)替換dirscan
,你需要重構你的類,它是一個依賴項或參數。 或者,您可以使用PowerMockito
的whenNew
功能。
讓我們假設您更改了您的類,並且您提供DirScan
對象作為參數而不是String source
。 您需要在其他地方為 dirscan 使用某種創建方法(可能是static
方法)。
final List<String> options = Arrays.asList("recursive","allFiles","includeDir");
public DirScan createDirScan(String source) {
// This class comes from a package
final DirScan dirscan = new DirScan(source, options) {
@Override
protected Action getResult(final String result) {
destination.onNext(result);
return Action.Continue;
}
};
return dirscan;
}
public void fetchLocalData(final DirScan dirscan, final ObservableEmitter<String> destination) {
dirscan.scan();
destination.onComplete();
}
從你的問題來看,你似乎想測試與目標對象的交互,所以你不想模擬dirscan
對象(因為如果你這樣做就不會有任何交互)。 您可能想要使用spy
並僅替換getResult
方法。
在您的測試,現在你可以再簡單地通過一個spy
的dirscan
對象,並確定它與行為thenAnswer
。
final ObservableEmitter<String> destination = ...
DirScan dirscan = Mockito.spy(createDirScan(source, destination));
Mockito.when(dirscan.getResult(Mockito.any(String.class))).thenAnswer((Answer<Action>) invocation -> {
String result = invocation.getArgument(0);
destination.onNext(result);
return Action.Continue;
});
classUnderTest.fetchLocalData(dirscan, destination);
在這一點上,您可能會注意到最好不要使用間諜,而只使用真正的DirScan
對象。 使用spy
來做你打算用 overriden 方法做的事情對我來說看起來有點矯枉過正。
真實的物體必須工作才能讓這個測試有價值,所以你不妨測試真實的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.