2013-03-23 3 views
3

대거를 사용하여 Android 프로젝트의 활동에 종속성을 주입합니다. 모든 공급자는 Application 하위 클래스에 의해 저장되고 관리되는 하나의 모듈로 유지됩니다. 액티비티는 onCreate()에 종속성을 주입하여 컨텍스트에서 모듈을 가져옵니다.대거 및 Android - 테스트의 경쟁 조건은 무엇입니까?

테스트에서 가끔 기본 모듈을 다른 모듈로 바꿔야합니다. ActivityAndroidTestCase2을 사용하고 있습니다. 나는 getActivity()를 호출하기 전에, 다음과 같이 모듈을 대체 응용 프로그램 컨텍스트를 얻을 :

Context applicationContext = getInstrumentation() 
    .getTargetContext().getApplicationContext(); 
module.setAppContext(applicationContext); 
Thread.sleep(1000);   // note this 
((ObjectGraphProvider) applicationContext).setModule(module); 

MyApplication 코드 :

public class MyApp extends Application implements ObjectGraphProvider { 

    private ObjectGraph objectGraph; 
    private Object module; 

    public MyApp() { 
     super(); 
     ApplicationContextModule myModule = new DefaultModule(); 
     myModule.setAppContext(this); 
     this.module = myModule; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     objectGraph = ObjectGraph.create(module); 
    } 

    @Override 
    public ObjectGraph objectGraph() { 
     return objectGraph; 
    } 

    /* Test only */ 
    public void setModule(Object module) { 
     this.module = module; 
     objectGraph = ObjectGraph.create(module); 
    } 
} 

슬프게도, 테스트가 때때로 실패 - 그 이유입니다 첫 번째 코드 스 니펫의 sleep() 스레드가 잠자기 시간이 길어질수록 오류의 가능성은 더 적지 만 문제가 해결되지는 않습니다.

이 이상한 동작을 일으키는 원인과이 문제를 해결하는 방법에 대한 의견이 있으십니까?

+0

당신이 실패했다고 말하는 것은 무엇을 의미합니까? 오류가 발생합니까? logcat에 유용한 것이 있습니까? – ZoFreX

답변

1

Dagger와 Cucumber-jvm을 사용하여 테스트 한 결과 비슷한 문제가 발생했습니다.

  • 개체 그래프를 새 것으로 설정하면 이전 그래프의 구성 요소에 대한 느린 참조가 없는지 확인하십시오. 이는 여전히 시스템에서 활성화되어 있고 그래프에 의해 삽입 된 오브젝트에 대한 참조를 보유하고있는 모든 활동, 서비스, BroadcastReceivers 등을 의미합니다. 그래프를 재설정하기 전에 열려있는 모든 작업을 완료하는 것이 좋습니다. 필자의 경우, 오래된 그래프의 삽입 된 레퍼런스를 붙잡고있는 백그라운드 서비스가있었습니다. 테스트 실행 사이에 끼어 들지 않도록 서비스에 명시 적으로 stopSelf()을 호출해야했습니다. 이것은 새로운 그래프가 시작되었을 때 주사를 맞출 수있게 해줍니다.
  • ID를 사용하는 PendingIntents, Notifications 및 기타 Android에 완전히 임의의 ID를 사용합니다. 실수로 내 PendingIntents에서 ID를 다시 사용하고 있는데 이로 인해 까다로운 오류가 발생했습니다.
  • 그래프를 재설정하기 전과 후에 유지 될 수있는 다른 상태를 찾으십시오. 필자는 결국 앱 상태를 완전히 지우고 새로 시작하는 절차를 제안했습니다. 모든 공유 환경 설정을 지우고 모든 알림을 취소하고 열린 활동을 모두 마친 다음 그래프를 다시 설정합니다.
관련 문제