我该如何模拟和测试这门课?

che*_*048 3 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

我是一个Android开发人员.我在测试和模拟代码时遇到了一些麻烦.我使用了mockito.我已经尝试了一些代码来测试它,但结果并不是我的期望.

1.第一次尝试

@Test
public void test(){
    Demo demo=new Demo();
    assertEquals(demo.getStr(0),"F0");
    /**
    *  java.lang.AssertionError: 
    *  Expected :null 
    *  Actual   :F0
    */
}
Run Code Online (Sandbox Code Playgroud)

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
     */
}
Run Code Online (Sandbox Code Playgroud)

任何人告诉我如何解决这个问题,通过调用真正的方法使demo.getStr(0)=="F0"?谢谢!

===========================

另一个问题与此有关

我已经尝试了另一个测试来测试android.util.Pair类,结果是"pair.first"为null ,.(有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?
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么简单的代码在真实的android环境中是正确的,但测试失败?

Sia*_*oli 8

我也有同样的问题.一个月前我也遇到了TextUtils类的问题.

我向jUnit报告此问题,但他们坚持认为问题在于android包.

所以你可以考虑很多android包有jUnit的问题,也许roboLectric可以处理这些.

对于那种情况,你可以使用这个包.这对我有用

import android.support.v4.util.Pair;
Run Code Online (Sandbox Code Playgroud)