2012-01-15 4 views
6

assertNotNull(mActivity);과 같은 몇 가지 간단한 테스트가 있습니다. (M.D.Torres "Android Application Testing Guide"를 읽었습니다.) 테스트중인 활동이 정상적으로 실행됩니다. 모든 단일 테스트는 정상적으로 실행됩니다. 하지만 두 번째 테스트에서 한 번에 여러 테스트를 실행하면 getActivity() 결코 반환되지 않습니다. logcat에 오류가 없습니다 (마지막 행 "시작 의도 ..."). 디버깅이 도움이되지 않습니다. getActivity()에 들어가면 사용할 수있는 소스 코드가 없다는 오류가 발생합니다.
다른 테스트 프로젝트 - Google의 ActivityTesting이 여러 테스트에서라도 제대로 실행되므로 Eclipse가 올바르게 구성됩니다.
아무도 그런 일이 없었습니까?두 번째 테스트에서는 getActivity()가 반환하지 않습니다

답변

8

"깨끗한 방"과 같은 테스트 프로젝트를 다시 한 번 만들어서 효과가있었습니다. 그런 다음 두 가지 프로젝트를 비교하고 범인을 찾았습니다. 공백 해임 :

protected void tearDown() throws Exception { 
} 

제거하면 모든 테스트가 녹색으로 실행됩니다. 다시 붙여 넣으면 두 번째 테스트가 중단됩니다. 이제 설명을 읽고 대답으로 표시 할 준비가되었습니다.

편집 :tearDown 메서드 끝에는 super.tearDown()을 호출해야합니다. 모든 사람을 불편을 드려 죄송합니다.

+0

끝내 주셔서 감사합니다. –

+0

u만이 아닙니다. 감사! – iewnait

+0

나는이 문제도 가지고 있었기 때문에 당신은 누군가에게 그것을 묻는 것으로 귀찮게하지 않았습니다. 나는 당신이 해결책에 추가했음을 진심으로 감사한다. – jwir3

1

ActivityInstrumentationTestCase2를 사용하여 ExoPlayer를 사용하여 활동을 테스트하고 올바른 리소스 정리를 수행했습니다. 클린업 및 최종 검사는 모든 테스트에서 동일하므로 tearDown()을 구현하는 것이 좋습니다. 모든 테스트는 문제없이 별도로 실행되지만 여러 테스트를 실행하면 getActivity()가 반환되지 않는 경우가 있습니다. 내의 tearDown()는 여러 가지 구현 : 활동의

  • 체크 상태 (다양한 어설() 호출) 선수의
  • 체크 상태 (다양한 어설()를 호출)
  • 수동으로 선수 자원을 정리를 (가까운 전화()과 해제())
  • setActivity (null가) (이것은 내가 모든 제안 된 해결 방법을 시도

문제)

  • super.tearDown()를 발생 getActivity()를 오버라이드하고 다른 인스트루먼트 메소드를 사용하여 액티비티를 생성하고 정리하는 것. 이 방법은 도움이되지 못했습니다.

    위의 시나리오에서 이전 테스트의 onDestory()가 다음 테스트의 onCreate()와 겹칠 수 있다는 점을 보여주는 많은 디버깅이있었습니다.

    test1.getActivity(); 
    test1.tearDown() called; 
    test1.tearDown() over; 
    test2.getActivity() 
    test2.onCreate(); 
    test1.onStop(); --> why is this late? 
    test1.onDestroy(); --> why is this late? 
    test2.tearDown() called; 
    test2.tearDown() over; 
    test3.getActiviy() --> this should call test3.onCreate, but did not and never returned. 
    

    이 테스트 케이스는 별도의 ActivityInstrumentationTestCase2 클래스/파일에 구현하는 경우에도 발생합니다 그래서 로그는이 순서로 라이프 사이클 이벤트를 보여 주었다. 그리고이 겹침이 아직 겹치지 않아서 2 개의 테스트가 항상 OK이지만,이 겹침을 초래하는 순서로 3 개의 테스트를 실행하면 getActivity()에 대한 세 번째 호출이 결코 리턴되지 않습니다.

    필자는 계기를 사용하여 onPause() + onStop() + onDestroy()를 수동으로 호출하고, 테스트 사이에 긴 수면 시간을 도입하고, instrumentationTestCase의 작업을 지우고, 내 tearDown의 점검을 재정렬하는 것과 같은 모든 것을 시도했지만 아무런 도움이되지 않았습니다. .마지막으로, 나는 실수로 검사 전에 setActivity (널)을 제거하고, 라이프 사이클 이벤트가 올바르게 정렬있어 :

    test1.tearDown() called; 
    test1.onStop(); 
    test1.onDestroy(); 
    test1.tearDown() over; 
    test2.getActivity() 
    test2.onCreate(); 
    ... 
    

    그래서 정말 내 경우의 차이를 만들 었는지 : ActivityTestCase.setActivity를 호출하지 않습니다(). 이로 인해 super.tearDown()이 활동의 ​​라이프 사이클 이벤트를 직접 호출하지 못하게하고 정리 작업이 나중에 발생하여 문제를 일으킬 수 있습니다.

  • 관련 문제