簡體   English   中英

使用 JUnit 和 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 ,你需要重構你的類,它是一個依賴項或參數。 或者,您可以使用PowerMockitowhenNew功能。

讓我們假設您更改了您的類,並且您提供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方法。

在您的測試,現在你可以再簡單地通過一個spydirscan對象,並確定它與行為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM