【问题标题】:Android Unit Testing with JUNIT Framework使用 JUNIT 框架进行 Android 单元测试
【发布时间】:2015-05-12 10:58:02
【问题描述】:

我刚刚开始在 android 中进行单元测试

将我的 TEST 文件夹放在 src 下,因此路径类似于 /src/TEST。

我的 /src/main/java/com/example/prabhu/mathapplication 由我的活动和 java 类组成。

我只想运行一个测试来检查一个方法是否被执行,但我无法解决这个错误,据我所知,这是由于找不到链接。所以在编写测试时我该如何解决这以及如何为此使用模拟。

我的测试代码是:

    /**
 * Created by prabhu on 12/05/15.
 */

    import com.example.prabhu.mathapplication.CalcNative;
    import com.example.prabhu.mathapplication.MainActivity;

    import junit.framework.TestCase;

    import org.junit.After;
    import org.junit.Before;
    import org.junit.*;

public class MyAdderTest extends TestCase {
    private MainActivity mMyAdder;
   // private CalcNative do_calculation_in_native;

    int x,y;

    @Before
    public void setUp() throws Exception {
        // Code that you wish to run before each test
        mMyAdder = new MainActivity();
       // do_calculation_in_native = new CalcNative();
        x=2;
        y=3;

    }

    @After
    public void tearDown() throws Exception {
        // Code that you wish to run after each test
    }

    @Test
    public void testAdd() {
        mMyAdder.iterate_java(9999,9999,9999);
       // boolean x = do_calculation_in_native.perform_calculations(1234,1234,1234);
        int z = x+y;
        assertEquals(z,5);
       // assertEquals(true,x);
    }

}

如果我注释掉包含类和测试用例工作的行,我不会收到任何错误...

错误是:

java.lang.UnsatisfiedLinkError: no CalcNative in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1119)
at com.example.prabhu.mathapplication.MainActivity.<clinit>(MainActivity.java:118)
at MyAdderTest.setUp(MyAdderTest.java:22)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

我的项目结构如下:

MainActivity.java 如下:

    package com.example.prabhu.mathapplication;

import android.app.ActivityManager;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

    RadioButton jni_radio,java_radio;
    EditText number1,number2,iterate;
    int input_number1,input_number_2,iterator,increment;
    Boolean check_operations;
    TextView add_number,diff_between,product_of,divided_by;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        jni_radio = (RadioButton)findViewById(R.id.radioButton);
        java_radio = (RadioButton)findViewById(R.id.radioButton2);

                number1 =(EditText)findViewById(R.id.editText);
                number2 = (EditText)findViewById(R.id.editText2);
                iterate = (EditText)findViewById(R.id.editText3);

                try
                {
                    input_number1 = Integer.parseInt(number1.getText()+"");
                    input_number_2 = Integer.parseInt(number2.getText()+"");
                    iterator = Integer.parseInt(iterate.getText()+"");
                }catch (Exception e)
                {

                }


                if(java_radio.isChecked())
                {
                    iterate_java(input_number1,input_number_2,iterator);
                }
                else if(jni_radio.isChecked())
                {
                    check_operations = (Boolean) CalcNative.perform_calculations(input_number1,input_number_2,iterator);
                }
    }


    public static void iterate_java(int input_number1,int input_number_2,int iterator)
    {
        for(int increment = 0;increment<iterator;increment++)
        {
            int l = input_number1+input_number_2;
            int j = input_number1-input_number_2;
            int k  = (input_number1*input_number_2);
            int i = input_number1/input_number_2;
        }
    }

    static
    {
        System.loadLibrary("CalcNative");
    }

【问题讨论】:

  • 粘贴这个 com.example.prabhu.mathapplication.MainActivity。带有行号的活动
  • @N5。我已经添加了 MainActivity

标签: android unit-testing junit


【解决方案1】:

修改你的代码如下:

   try {
        System.loadLibrary("CalcNative");           
    } catch (UnsatisfiedLinkError e) {
        // TODO: handle exception
    }

解释:测试框架还不支持 loadLib 函数因此像 jni 等 api 将不适用于 android 测试 框架。上面的 try-catch 块无论如何都不会损害你的代码 当你运行你的测试用例时逃跑。

【讨论】:

  • 你能帮我了解如何在android中使用模拟
  • 为哪些类或 API 创建模拟?
  • 一个示例代码和一些我可以从中学习的资源将帮助我开始......非常感谢 :)
  • 我建议使用 robolectric-testing-framework,其中有许多影子类在 android testing 中用作模拟。对于纯 Android 测试 Fremawork 文档-->code.google.com/p/android-mock/wiki/…
  • 我们不能使用官方支持的 JUNIT 或 Monkey Runner 吗??
猜你喜欢
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
相关资源
最近更新 更多