2014-09-05 3 views
1

테스트 할 간단한 애플리케이션이 있습니다. 여기에는 두 개의 액티비티와 두 개의 버튼이 있습니다. 각 버튼은 다른 액티비티 (MainActivity 및 MainActivity2)로 이동하며, 간단한 Robotium 테스트를 수행하려고합니다. 나는 다음과 같은 오류가 점점 오전 : 내가 찾을 수있는 모든 것을 시도했습니다Android 앱 테스트 : 스위트 빌드 중 예외가 발생했습니다.

java.lang.RuntimeException: Exception during suite construction at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:238) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1840) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.constructNative(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at android.test.suitebuilder.TestMethod.instantiateTest(TestMethod.java:87) at android.test.suitebuilder.TestMethod.createTest(TestMethod.java:73) at android.test.suitebuilder.TestSuiteBuilder.addTest(TestSuiteBuilder.java:262) at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:184) at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:379) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5142) at android.app.ActivityThread.access$1500(ActivityThread.java:156) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1418) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:157) at android.app.ActivityThread.main(ActivityThread.java:5872) at java.lang.reflect.Method.invokeNative(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at android.view.ViewConfiguration.get(ViewConfiguration.java:338) at android.view.View.(View.java:3490) at android.view.View.(View.java:3547) at android.widget.TextView.(TextView.java:674) at android.widget.Button.(Button.java:107) at android.widget.CompoundButton.(CompoundButton.java:68) at android.widget.CheckBox.(CheckBox.java:68) at android.widget.CheckBox.(CheckBox.java:64) at android.widget.CheckBox.(CheckBox.java:60) at com.example.twoactivities.test.RobotiumTest1.(RobotiumTest1.java:19) ... 18 more

을, 그 해결책으로 나를 위해 작동하지 않습니다.

package com.example.twoactivities.test; 

import com.example.twoactivities.*; 
import com.robotium.solo.Solo; 
import android.test.ActivityInstrumentationTestCase2; 
import android.widget.CheckBox; 
import android.widget.CheckBox; 
import android.app.Activity;  

public class RobotiumTest1 extends ActivityInstrumentationTestCase2<MainActivity> { 

     private Solo solo; 

     public RobotiumTest1() { 
      super(MainActivity.class); 
     } 

     @Override 
     public void setUp() throws Exception { 
      //setUp() is run before a test case is started. 
      //This is where the solo object is created. 
      solo = new Solo(getInstrumentation(), getActivity()); 
     } 

//  @Override 
//  public void tearDown() throws Exception { 
//   //tearDown() is run after a test case has finished. 
//   //finishOpenedActivities() will finish all the activities that have been opened during the test execution. 
//   solo.finishOpenedActivities(); 
//  } 


     public void testClickButton() throws Exception{ 

      solo.assertCurrentActivity("Expected to be on MainActivity activity", "MainActivity.class"); 
      solo.clickOnButton("Go to page 2"); 
      solo.assertCurrentActivity("Not on Activity 2", MainActivity2.class); 
      solo.clickOnButton("Go to page 1"); 
      solo.assertCurrentActivity("Not on Activity 1", MainActivity.class); 

     }  

    } 

어떤 아이디어 :

내 코드는 여기 (생성자의 어떤 매개 변수는 테스트중인 내 응용 프로그램 등 "디버깅"는 것을 보장 JAR 파일이 올바른 위치에 있는지 확인하기 위해 경로를 구축 체크 없음) 이 시험을 어떻게 달릴 수 있니?

감사합니다, 스테파니

편집 :

MainActivity

package com.example.twoactivities; 

import com.example.twoactivities.R; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.CheckBox; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
     final CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1); 
     final TextView text2 = (TextView) findViewById(R.id.checkBoxTextView); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void activity2(View view){ 
     Intent intent = new Intent(this,com.example.twoactivities.MainActivity2.class); 
     startActivity(intent); 
    } 

    public void onCheckBoxClicked(View view){ 
     if (checkBox.isChecked()) { 
      text2.setText("Checked"); 
     } 
     else { 
      ((TextView) findViewById(R.id.checkBoxTextView)).setText("Unchecked"); 
     } 
    } 
} 

MainActivity2

package com.example.twoactivities; 

import com.example.twoactivities.R; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 

    public class MainActivity2 extends Activity { 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main2); 
      } 

      public void activity1(View view){ 
       Intent intent = new Intent(this,com.example.twoactivities.MainActivity.class); 
       startActivity(intent); 
      } 

} 

나는 그 이후 실제로 변경하지 않은 것을 (나는 생각하지 않는다) 마지막으로 성공적으로 실행되었습니다.

9 월 12 일 편집 : "solo"객체가 사용 되다가 초기화되었습니다.

package com.example.twoactivities.test; 

import com.example.twoactivities.*; 
import com.example.twoactivities.R; 
import com.robotium.solo.Solo; 
import android.test.ActivityInstrumentationTestCase2; 
import android.widget.CheckBox; 
import android.widget.TextView; 


public class RobotiumTest1 extends ActivityInstrumentationTestCase2<MainActivity> { 

     public Solo solo; 
     private TextView checkBoxText; 
     public CheckBox checkBox1 ; 

     public RobotiumTest1() { 
      super(MainActivity.class); 
     } 

     @Override 
     public void setUp() throws Exception { 
      //setUp() is run before a test case is started. 
      //This is where the solo object is created. 
      solo = new Solo(getInstrumentation(), getActivity()); 
      checkBoxText = (TextView) getActivity().findViewById(R.id.checkBoxTextView); 
      checkBox1 = (CheckBox) getActivity().findViewById(R.id.checkBox1); 
     } 

     public void testClickButton() throws Exception{ 

      solo.assertCurrentActivity("Expected to be on MainActivity activity", "MainActivity"); 
      solo.clickOnButton("Go to page 2"); 
      solo.assertCurrentActivity("Not on Activity 2", MainActivity2.class); 
      solo.clickOnButton("Go to page 1"); 
      solo.assertCurrentActivity("Not on Activity 1", MainActivity.class); 

     } 

답변

4

실마리는 게시 한 로그에 있습니다.

Caused by: java.lang.NullPointerException 
at android.view.ViewConfiguration.get(ViewConfiguration.java:338) 
at android.view.View.(View.java:3490) 
at android.view.View.(View.java:3547) 
at android.widget.TextView.(TextView.java:674) 
at android.widget.Button.(Button.java:107) 
at android.widget.CompoundButton.(CompoundButton.java:68) 
at android.widget.CheckBox.(CheckBox.java:68) 
at android.widget.CheckBox.(CheckBox.java:64) 
at android.widget.CheckBox.(CheckBox.java:60) at com.example.twoactivities.test.RobotiumTest1.(RobotiumTest1.java:19) ... 18 more 

당신은

(나는 당신을 위해 여기에 보이는 것, 당신이 그것을 추가하는 경우 주)되지 그러나 여기에 게시 코드이 NullPointerException는 응용 프로그램 코드에하는 NullPointerException는 문제를 일으키는 원인이 편집 아래의 코드는 문제 :

문제는 당신이) 실제로에서 onCreate (때까지 존재하지 않는 뷰를 찾기 위해 노력하고있다 그래서이 될 것이라고
public class MainActivity extends Activity { 
      final CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1); 
      final TextView text2 = (TextView) findViewById(R.id.checkBoxTextView); 

없는. 이들의 초기화를 onCreate()로 옮기면 괜찮을 것입니다.

다음 의견을 편집하여 의견을 말하십시오.

이제 우리는 Robotium에서 멀리 떨어져 있고 핵심 자바에 대해, 당신이 지금 가지고있는 문제는 범위입니다. 변수를 선언하는 곳은 당신이 변수를 인스턴스화하는 곳과 다릅니다. 변수 존재를 현재 범위와 동일하게 선언 할 수 있지만 onCreate()에서 인스턴스화합니다.

package com.example.twoactivities; 

import com.example.twoactivities.R; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.CheckBox; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
     final CheckBox checkBox; 
     final TextView text2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     checkBox = (CheckBox) findViewById(R.id.checkBox1); 
     text2 = (TextView) findViewById(R.id.checkBoxTextView); 
    } 

    public void activity2(View view){ 
     Intent intent = new Intent(this,com.example.twoactivities.MainActivity2.class); 
     startActivity(intent); 
    } 

    public void onCheckBoxClicked(View view){ 
     if (checkBox.isChecked()) { 
      text2.setText("Checked"); 
     } 
     else { 
      ((TextView) findViewById(R.id.checkBoxTextView)).setText("Unchecked"); 
     } 
    } 
} 
+0

수정 됨 ... thanks. – Stephanie

+0

흠 ... 그렇게하면 onCheckBoxClicked에서 사용할 수 없습니다. 그들은 범위를 벗어났습니다. – Stephanie

+0

onCreate - main 프로그램에서 인스턴스화 할 주 프로그램이 완벽하게 수정되었습니다. 위의 NullPointerException으로 JUnit 테스트가 실패합니다.(나는 우리가 여기 서클에있는 것처럼 느낍니다. :)) – Stephanie