我怎么能模拟和测试这个课程?

时间:2016-09-05 13:35:21

标签: android unit-testing mockito

以下是我要测试的代码。

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环境中是正确的,但在测试中失败?

3 个答案:

答案 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文件(我还没有测试它是否有效)