簡體   English   中英

如何通過junit測試用例運行時避免實際方法調用

[英]How to avoid actual method call while running through junit test case

我有以下情況。

一個類MyClass ,其中有一個API myAPI()其內容如下:

class MyClass {
    public void myAPI() {
        ...
        MyOtherClass myOtherObj = new MyOtherClass();
        String value = myOtherObj.decodeAndGetName();
        ...
    }
}

在這里,我們有MyOtherClass ,它包含一個執行一些操作的API的decodeAndGetName() 它在不同的程序包中,我無法修改其代碼。

需求

我需要為上述myAPI()編寫一個junit測試。 現在,我想以某種方式模擬MyOtherClass的對象,並模擬decodeAndGetName()的返回值。

我無法執行此操作,因為我們有了一個new MyOtherClass() ,一旦流程進入這一行,它就會創建一個新實例,並轉到decodeAndGetName() API。 我需要的是某種方法來防止流進入decodeAndGetName()並在上面的代碼中遇到此調用時采用模擬值代替。

請讓我知道一種方法。

我僅將其與Android代碼一起使用,但是我認為您可以使用類似於Mockito的代碼在測試中模擬MyOtherClass,例如:

MyOtherClass mockMyOtherClass = Mockito.mock(MyOtherClass.class);
when(mockMyOtherClass.decodeAndGetName()).thenReturn(new String("known return value");

我也建議使用依賴注入並使用類似Guice的東西來完成此任務。 我每天將Guice&Mockito與我的Android項目結合使用來成功地完成這種事情。

簡要例子
使用Guice設置依賴項注入后,代碼如下所示:

MyOtherClassWrapper.java

@Singleton
public class MyOtherClassWrapper {

    private MyOtherClass myOtherClass = new MyOtherClass();

    public String decodeAndGetName() {
        return getMyOtherClass().decodeAndGetName();
    }

    ...

    private MyOtherClass getMyOtherClass() {
        return myOtherClass;
    }

}

MyClass.java

class MyClass {

    ...

    @Inject private MyOtherClassWrapper myOtherClassWrapper;

    ...

    public void myAPI() {
    ...
    String value = getMyOtherClassWrapper().decodeAndGetName();
    ...
    }

    private MyOtherClass getMyOtherClassWrapper() {
        return myOtherClassWrapper;
    }
}

有關如何開始設置Guice的信息,請參閱《 Guice用戶指南》 不太困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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