mockito 我如何模拟和测试这个类?

xxe27gdn  于 2022-11-08  发布在  其他
关注(0)|答案(4)|浏览(231)

下面是我想测试的代码。

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

tktrz96b

tktrz96b1#

我也有同样的问题。一个月前我也有TextUtils类的问题。
我向jUnit报告了这个问题,但他们告诉我问题出在android包上,因为在单元测试环境中,您无法访问特定于平台的类
对于成对情况,你可以使用这个软件包。2这个对我很有效

import android.support.v4.util.Pair;
8cdiaqws

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从来没有设置过。如果你修复了这个问题,它应该也能工作(未经测试)。

laik7k3q

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

omjgkv6w

omjgkv6w4#

另一种方法(基于this)是在app/src/test/java/android/util/Pair.java中创建类,然后从Android实现中复制代码。
这样就不需要额外的依赖项了。(在复制之后,可能会出现与实现更改相关的问题,但是依赖项也可能会失效。)

相关问题