Android Unit Testing with JUNIT Framework

2019-06-14 11:27发布

问题:

I have just started Unit Testing in android

placed my TEST folder under src so the path is like /src/TEST.

My /src/main/java/com/example/prabhu/mathapplication consists of my activities and java classes.

I just want to run a test to check wether a method gets executed or it doesn't but I am unable to resolve this ERROR which to my understanding is due to not finding the link.So while writing tests how do I resolve this and how to use mocks for this.

MY TEST CODE IS :

    /**
 * 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);
    }

}

I don't get any errors if I comment out the lines containing the class and test cases work ...

The error is :

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)

MY PROJECT STRUCTURE IS BELOW :

The MainActivity.java is as follows :

    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");
    }

回答1:

Modify you code like below :

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

Explanation : The Test Framework does not support yet the loadLib functions hence apis like jni etc will not work with android test framework. Above try-catch block wont harm ur code in anyway it will just escape when you run your test-cases.