下面是我想测试的代码。
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
*/
}
有没有人告诉我如何通过调用真实的方法来解决这个问题?谢谢!
另一个问题与之相关
我已经尝试了另一个测试来测试android.util.Pair类,结果是“pair.first”为空,.(有androidTest和测试目录,我把它放在测试包中。它是否影响了结果?)
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环境中是正确的,但在测试中失败?
4条答案
按热度按时间tktrz96b1#
我也有同样的问题。一个月前我也有TextUtils类的问题。
我向jUnit报告了这个问题,但他们告诉我问题出在android包上,因为在单元测试环境中,您无法访问特定于平台的类
对于成对情况,你可以使用这个软件包。2这个对我很有效
8cdiaqws2#
第一次尝试的问题是,公共字段“first”实际上为空。
Pair类是来自“javafx.util”包还是自定义实现?您是否忘记了“this.first = first”或“Pair”类的构造函数中的类似内容?
我还建议更改以下行:
(0)、“F0”、“F1”、“F2”、“F3”、“F4”、“F5”、“F6”、“F7”、“F8”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、“F9”、
至
(0).如果是,则返回一个值。
以便正确打印错误。
你的第二次尝试没有任何意义。嘲笑你想测试的类有什么意义呢?
我认为第二个例子和第一个例子有同样的问题。Pair.first从来没有设置过。如果你修复了这个问题,它应该也能工作(未经测试)。
laik7k3q3#
来自Google的Android工具网站:
“方法......不被嘲笑"
用于运行单元测试的android.jar文件不包含任何实际代码--实际代码由真实设备上的Android系统映像提供。* 相反,所有方法都会抛出异常(默认情况下)*。这是为了确保您的单元测试只测试您的代码,而不依赖于Android平台的任何特定行为(您没有明确模拟,例如使用Mockito)。
"那我们该怎么解决这个问题“
换句话说,如果你需要一个默认的android类来正常工作,你要么从一个单独的仓库中包含它,要么自己实现它。
在Android的Pair类中,您可以使用
android.support.v4.util.Pair
。要访问此类,您可以在build.gradle或依赖项文件中包含
com.android.support:support-compat:27.0.0
。如果您没有使用Gradle,您可以复制此文件的实现,并使用它来代替正式的实现。或者您可以尝试从这个旧版本https://mvnrepository.com/artifact/com.google.android/support-v4/r7下载.jar文件(我还没有测试它是否工作)
omjgkv6w4#
另一种方法(基于this)是在
app/src/test/java/android/util/Pair.java
中创建类,然后从Android实现中复制代码。这样就不需要额外的依赖项了。(在复制之后,可能会出现与实现更改相关的问题,但是依赖项也可能会失效。)