以下是我要测试的代码。
public class Demo {
private static final List<Pair<String, String>> mList;
static {
mList = new ArrayList<>();
mList.add(new Pair<>("F0", "T1"));
mList.add(new Pair<>("F1", "T2"));
mList.add(new Pair<>("F2", "T3"));
}
public String getStr(int pos) {
return mList.get(pos).first;
}
}
我是一名Android开发人员。我在测试和模拟代码时遇到了一些麻烦。我使用了mockito。 我已经尝试了一些代码来测试它,但结果并不是我的期望。
1.首先尝试
@Test
public void test(){
Demo demo=new Demo();
assertEquals(demo.getStr(0),"F0");
/**
* java.lang.AssertionError:
* Expected :null
* Actual :F0
*/
}
2.第二次尝试
@Test
public void test() {
Demo demo = mock(Demo.class);
doCallRealMethod().when(demo).getStr(0);
assertEquals(demo.getStr(0), "F0");
/**
* java.lang.AssertionError:
* Expected :null
* Actual :F0
*/
}
有人告诉我如何解决这个问题,通过调用真正的方法来制作demo.getStr(0)==“F0”?谢谢!
===========================
另一个与之相关的问题
我已经尝试了另一个测试来测试android.util.Pair类,结果是“pair.first”为null ,.(有androidTest和test目录,我把它放到测试包中。它影响了结果?)
import android.util.Pair;
import org.junit.Test;
import org.mockito.Mockito;
import static org.junit.Assert.assertEquals;
public class DemoTest {
@Test
public void test1(){
Pair<String,String> pair=new Pair("First","Second");
assertEquals("First",pair.first);
//pair.first was null,why?
}
@Test
public void test2(){
Pair<String,String> pair= Mockito.spy(Pair.class);
assertEquals("First",pair.first);
//pair.first was null also,why?
}
}
为什么简单代码在真实的android环境中是正确的,但在测试中失败?
答案 0 :(得分:7)
我也有同样的问题。一个月前我也遇到了TextUtils课的问题。
我向jUnit报告此问题,但他们坚持认为问题出在android包中。
所以你可以考虑很多android包有jUnit的问题,也许roboLectric可以处理这些。
对于那个案例,你可以使用这个包。这对我有用
import android.support.v4.util.Pair;
答案 1 :(得分:0)
第一次尝试的问题是,公共字段“first”实际上是空的。
Pair类是“javafx.util”包还是自定义实现? 您是否在“配对”类的构造函数中忘记了“this.first = first”或类似内容?
我还建议更改以下行:
的assertEquals(demo.getStr(0), “F0”);
到
assertEquals(“F0”,demo.getStr(0));
以便正确打印错误。
你的第二次尝试没有任何意义。嘲笑你要测试的课程有什么意义?
我认为第二个例子与第一个例子有同样的问题。从不设置Pair.first。如果你解决了这个问题,它也应该可以工作(未经测试)。
答案 2 :(得分:0)
来自Google的Android工具网站:
“方法......没有嘲笑。”
用于运行单元测试的android.jar文件不包含任何实际代码 - 由真实设备上的Android系统映像提供。 相反,所有方法都抛出异常(默认情况下)。这是为了确保您的单元测试仅测试您的代码,并且不依赖于Android平台的任何特定行为(您没有明确嘲笑,例如使用Mockito)。
那么我们如何解决这个问题呢?
换句话说。如果你需要一个默认的android类来正常工作,你必须从一个单独的存储库中包含它,或者自己实现它。
在Android的Pair类中。您可以改为使用android.support.v4.util.Pair
。
要访问此类,可以在build.gradle或dependencies文件中包含com.android.support:support-compat:27.0.0
。
如果您不使用Gradle,则可以复制此文件的实现并使用它代替官方文件。或者您可以尝试从旧版本https://mvnrepository.com/artifact/com.google.android/support-v4/r7下载.jar文件(我还没有测试它是否有效)