Android 使用 JUNIT 框架进行单元测试
Android Unit Testing with JUNIT Framework
我刚开始 android 中的单元测试
将我的 TEST 文件夹放在 src 下,因此路径类似于 /src/TEST。
我的 /src/main/java/com/example/prabhu/mathapplication 由我的活动和 java class 组成。
我只想 运行 测试以检查方法是否被执行,但我无法解决此错误,据我所知,这是由于未找到 link.So 在编写测试时我该如何解决这个问题以及如何为此使用模拟。
我的测试代码是:
/**
* 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);
}
}
如果我注释掉包含 class 且测试用例有效的行,我不会收到任何错误...
错误是:
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");
}
修改你的代码如下:
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.
我刚开始 android 中的单元测试
将我的 TEST 文件夹放在 src 下,因此路径类似于 /src/TEST。
我的 /src/main/java/com/example/prabhu/mathapplication 由我的活动和 java class 组成。
我只想 运行 测试以检查方法是否被执行,但我无法解决此错误,据我所知,这是由于未找到 link.So 在编写测试时我该如何解决这个问题以及如何为此使用模拟。
我的测试代码是:
/**
* 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);
}
}
如果我注释掉包含 class 且测试用例有效的行,我不会收到任何错误...
错误是:
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");
}
修改你的代码如下:
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.