我有以下场景。
类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");
我还建议使用依赖注入(inject)并使用类似 Guice 的东西为了实现这一点。我每天在我的 Android 项目中结合使用 Guice 和 Mockito 来成功完成此类事情。
简单示例
使用 Guice 设置依赖注入(inject)后,您的代码可能如下所示:
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 User's Guide有关如何开始设置 Guice 的信息。这并不太难。
关于java - 如何在运行 junit 测试用例时避免实际的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19920762/