2012-01-13 4 views
2

모두 Testing Fundamentals 안드로이드 개발자 문서에 "상태 관리 테스트를 추가"라는 제목의 Activity Testing 섹션은 테스트 활동이 사용하여 다시 시작 제안 :안드로이드 활동의 시험 -에서 테스트를 다시 시작합니다

mActivity.finish(); 
mActivity = this.getActivity(); 

가 추가로이 시도 데 위의 두 문장 사이의 수면 중, 나는 mActivity = this.getActivity()가 실행될 때 Activity가 화면에 다시 그려지지 않음을 알 수 있습니다. 내 테스트가 제대로 작동하는 것처럼 보이지만 API 문서에서 언급하지 않은 것처럼 액티비티가 화면에 다시 그려지지 않는 이유에 대해 흥미가 있습니다.

누군가가 제공 할 수있는 통찰력에 감사드립니다. finish() 메서드가 호출 된 지점에서 Activity가 화면에서 사라지지만 this.getActivity()가 호출 될 때 다시 나타나지 않습니다. 또한 getActivity() 후에 mActivity.setVisible (true)을 넣으려고했으나 도움이되지 않습니다.

내 코드는 지금 :

... 
mActivity.finish(); 
Thread.sleep(5000); 
mActivity = this.getActivity(); 
Thread.sleep(5000); 
... 

내가 광범위하게 검색했지만, getActivity()가 호출 될 때 활동이 다시 나타나지 않는 이유의 설명을 찾을 수 없습니다.

나는 이것을 Android 2.3.5, 2.3.3 및 2.2.2에서 모두 동일한 결과로 테스트했습니다.

+1

는 UI 스레드가 화면에없는 때 내 UIThread 코드가 실행되지 않기 때문에,이 질문을 주셔서 감사를! – Noumenon

답변

8

ActivityInstrumentationTestCase2 클래스는 일부 정리가 완료되어야하는 추가 완료 메소드가 필요합니다. 그러는 동안 활동을 끝내면 스스로 정리하여이 문제를 해결할 수 있습니다. 코드를 다음과 같이 변경하십시오.

mActivity.finish(); 
setActivity(null); 
mActivity = this.getActivity(); 

이것은 다음과 같이 설명 할 수 있습니다. ActivityInstrumentationTestCase2 클래스의 메소드는 getActivity setActivity은 (a)

public T getActivity() { 
    Activity a = super.getActivity(); 
    if (a == null) { 
     // set initial touch mode 
     getInstrumentation().setInTouchMode(mInitialTouchMode); 
     final String targetPackage = 
      getInstrumentation().getTargetContext().getPackageName(); 
     // inject custom intent, if provided 
     if (mActivityIntent == null) { 
      a = launchActivity(targetPackage, mActivityClass, null); 
     } else { 
      a = launchActivityWithIntent(targetPackage, 
             mActivityClass, 
             mActivityIntent); 
     } 
     setActivity(a); 
    } 
    return (T) a; 
} 

방법 setActivity 내부 변수를 설정 mActivityIntent 부른다.

public void setActivityIntent(Intent i) { 
    mActivityIntent = i; 
} 

이 첫 번째 호출 이후의 모든 호출은 이제 새로운 값인 null 값 대신 mActivityIntent를 사용합니다. 결과적으로

a = launchActivityWithIntent(targetPackage, mActivityClass, mActivityIntent); 

이 호출됩니다. 아마도이 의도로 앱을 시작할 수 없습니다.

참고 방법 rearDown가 적절한 정리한다는 것을 :

protected void tearDown() throws Exception { 
    // Finish the Activity off (unless was never launched anyway) 
    Activity a = super.getActivity(); 
    if (a != null) { 
     a.finish(); 
     setActivity(null); 
    } 
} 
+0

이 대답은 onDestroy 테스트의 모든 목적을 이겨낸'activity.finish()'이후에 내 UI 스레드 코드가 이상하게 실행되지 않는 문제를 해결했습니다. 고맙습니다. – Noumenon

+0

문서에서 : 활동을 종료하고 다시 시작하십시오 : ** mActivity.finish(); ** ** mActivity = this.getActivity(); ** 실제로 설명서를 업데이트해야합니다 ... – Decoy

+0

고맙습니다. 이걸 찾았 어. – Decoy

관련 문제