![](/img/trans.png)
[英]How to avoid calling cascade of internal method structures, while doing Junit test case and mock for a particular method
[英]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.