2012-09-25 2 views
0

애플리케이션의 깨끗한 인스턴스에서 여러 단위 테스트를 실행하고 getActivity를 사용하여 인스턴스를 생성하고이를 수행 할 수 있다고 생각했습니다. 테스트. 그러나 이전 테스트의 동작이 다음 테스트에 영향을 미친 것으로 나타났습니다. 문제를 재현하기 위해 다음과 같은 간단한 응용 프로그램을 작성했습니다.Android 유닛 테스트, 테스트에서 액티비티간에 컨텍스트가 전달됨

테스트 설정에는 여러 가지 테스트가 표시되며 여기에서 작업을 가져 와서 각 테스트에서 완료합니다. 액티비티를 생성하는 동안 onCreate에서 카운터가 증가합니다. 나는 이것이 3 가지 테스트 모두에서 1이 될 것이라고 기대하지만 최신 테스트에서는 3입니다. 어떻게 든 컨텍스트가 재사용됩니다.

누군가가 설명하고 각 테스트에서 처음부터 응용 프로그램을 테스트 할 수있는 방법을 보여줄 수 있습니까?

import com.example.activitykeepscontext.MainActivity; 

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { 

    public MainActivityTest() { 
     super("com.example.activitykeepscontext", MainActivity.class); 
    } 

    public void testCount1() { 
     MainActivity mainActivity = getActivity(); 
     mainActivity.finish(); 
    } 

    public void testCount2() { 
     MainActivity mainActivity = getActivity(); 
     mainActivity.finish(); 
    } 

    public void testCount3() { 
     MainActivity mainActivity = getActivity(); 
     mainActivity.finish(); 
    } 

} 

이 응용 프로그램이다

package com.example.activitykeepscontext; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.util.Log; 
import android.view.Menu; 

public class MainActivity extends Activity { 

    private static final String TAG = "MainActivity"; 

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

     AppData appData = (AppData)getApplicationContext(); 
     appData.count++; 

     Log.i(TAG, "Count: " + appData.count); 
    } 
} 

이것은 애플리케이션 컨텍스트를 통해 데이터를 전달하기 위해 사용되는 클래스이다.

package com.example.activitykeepscontext; 

import android.app.Application; 

public class AppData extends Application { 
    public int count; 
} 

답변

0

그래서 어떤 응용 프로그램을 삽입 할 수있는 능력을 제공하는 ActivityUnitTestCase이 필요합니다. ActivityInstrumentationTestCase2는 응용 프로그램을 주입하는 방법을 제공하지 않으므로 Activity의 기본값을 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 안드로이드는 실제로 finish()를 사용하여 응용 프로그램을 종료하지는 않지만 백그라운드에서 종료한다는 것을 알게되었습니다. 컨텍스트가 재사용되면 재사용되면서 의도 된 것인지 궁금합니다. 솔루션은 매우 간단하며 onCreate()에서 응용 프로그램 컨텍스트를 통해 전달되는 변수를 초기화하는 것입니다. 이것은 항상 좋은 습관입니다. ActivityUnitTestCase를 사용하면 매번 컨텍스트를 정리할 수 있기 때문에 솔루션이 제대로 작동 할 것으로 기대합니다. – Lorenz

관련 문제