5

내 설정 :테스트 사용하는 프로젝트 ActionBarSherlock의

  1. 도서관 프로젝트 : ActionBarSherlock의
  2. 프로젝트
  3. 테스트 프로젝트

내 프로젝트는 라이브러리 프로젝트로 링크 된 라이브러리 프로젝트가 있습니다. 그것은 컴파일되어 잘 실행됩니다.

이제 일반 테스트 프로젝트를 사용하여 응용 프로그램을 테스트하려고합니다. 이클립스에서 테스트를 실행하면 완벽하게 작동합니다. 나는 개미를 사용하여 테스트를 실행하려고하면, 테스트 프로젝트도 컴파일되지 않습니다 : 일식을 통해

[javac] LoginActivityTest.java:9: cannot access com.actionbarsherlock.app.SherlockActivity 
[javac] class file for com.actionbarsherlock.app.SherlockActivity not found 
[javac] public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> { 
[javac]                  ^
[javac] LoginActivityTest.java:25: cannot find symbol 

건물은 완벽하게 작동하고 테스트도 완벽하게 실행됩니다.

테스트 프로젝트에 라이브러리 프로젝트를 연결하면 ant와 함께 컴파일되지만 테스트는 실패합니다.

[exec] Error in testSuiteConstructionFailed: 
[exec] java.lang.RuntimeException: Exception during suite construction 
[exec]  at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:238) 
[exec]  at java.lang.reflect.Method.invokeNative(Native Method) 
[exec]  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
[exec]  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
[exec]  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537) 
[exec]  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551) 
[exec] Caused by: java.lang.reflect.InvocationTargetException 
[exec]  at java.lang.reflect.Constructor.constructNative(Native Method) 
[exec]  at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
[exec]  at android.test.suitebuilder.TestMethod.instantiateTest(TestMethod.java:87) 
[exec]  at android.test.suitebuilder.TestMethod.createTest(TestMethod.java:73) 
[exec]  at android.test.suitebuilder.TestSuiteBuilder.addTest(TestSuiteBuilder.java:262) 
[exec]  at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:184) 
[exec]  at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:371) 
[exec]  at com.zutubi.android.junitreport.JUnitReportTestRunner.onCreate(JUnitReportTestRunner.java:90) 
[exec]  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3891) 
[exec]  at android.app.ActivityThread.access$1300(ActivityThread.java:122) 
[exec]  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1184) 
[exec]  at android.os.Handler.dispatchMessage(Handler.java:99) 
[exec]  at android.os.Looper.loop(Looper.java:137) 
[exec]  at android.app.ActivityThread.main(ActivityThread.java:4340) 
[exec]  at java.lang.reflect.Method.invokeNative(Native Method) 
[exec]  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
[exec]  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
[exec]  at dalvik.system.NativeStart.main(Native Method) 
[exec] Caused by: java.lang.NoClassDefFoundError: com.myproject.android.app.activities.LoginActivity 
[exec]  at com.myproject.android.app.test.LoginActivityTest.<init>(LoginActivityTest.java:18) 
[exec]  ... 19 more 

내 테스트 클래스가 :

public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> { 

    private LoginActivity mActivity; 

    private EditText  mTextUserName; 

    private EditText  mTextUserPassword; 

    public LoginActivityTest() { 
     // the super call is line 18 (see stack trace above) 
     super("com.myproject.android.app.activities", LoginActivity.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     mActivity = getActivity(); 
     mTextUserName = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_username); 
     mTextUserPassword = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_password); 
    } 

    public void testPreConditions() { 
     assertTrue("Activity is null!", mActivity != null); 
    } 

    public void testLogin() throws Throwable { 
     mActivity.runOnUiThread(new Runnable() { 
      public void run() { 
       mTextUserName.setText("username"); 
       mTextUserPassword.setText("password"); 
      } 
     }); 
     sendKeys(KeyEvent.KEYCODE_ENTER); 
    } 
} 

몇 가지 아이디어를 내가이 문제를 해결할 수있는 방법?

업데이트 : Ant 빌드/테스트가 여전히 엉망인 것처럼 보입니다. testing a library project에 대한이 블로그 항목에 따르면 7 가지 문제 중 대부분이 다음 ADT 릴리스 (ADT r20)에서 수정 될 예정입니다.

답변

7

ADT 17은 모든 것을 깨고/고정했기 때문에 Library 개의 프로젝트를 사용하는 것과 관련하여 많은 정보가 흐르고 있습니다 (현재 머리를 두드리는 사람에 따라 다릅니다).

먼저 Library과 "library"의 차이점을 확인하십시오. Library은 Android 팀에서 지정한 명사입니다. 또한 Library 프로젝트를 사용하는 프로젝트를 설명하는 Referencing 프로젝트도 사용하고 있습니다.

즉, Referencing 프로젝트는 Library 프로젝트를 사용합니다. 일반적인 자바 개발에

Library "라이브러리"프로젝트

그것은 하나가 다른 소스에 의존하는 경우 이클립스에 프로젝트를 연결하는 것이 가능하다. 이 접근법은 라이브러리 프로젝트 소스를 참조 프로젝트의 소스로 사용하는 효과가 있다고 생각합니다. 이는 참조하는 프로젝트를 컴파일하는 동안 라이브러리 프로젝트 소스가 범위에 있음을 의미합니다. 라이브러리 프로젝트 클래스는 참조하는 프로젝트 클래스와 동시에 빌드됩니다.

대부분의 상황에서 사용하기 위해 빌드 할 때 이것은 모든 클래스가 빌드 된 다음 JAR 또는 WAR 또는 기타로 패키징되기 때문에 완벽하게 작동합니다.

도서관 프로젝트

라이브러리 프로젝트에 대한 경쟁 (하지 믹스 앤 매치) 접근 방식은 Library 프로젝트 안드로이드 팀은 다음과 같습니다

안드로이드 프로젝트가 Library 프로젝트가 컴파일 것으로 표시 및 그 소스를 bin 디렉토리의 jar 파일에 빌드하십시오 (정리/빌드 명령 이후). 모든 Referencing은 자동으로이 jar을 가져오고 Library 프로젝트 기능에 액세스 할 수 있습니다. 패키지 탐색기에서 Java 라이브러리 Android Dependencies을 보면 이러한 관계를 알 수 있습니다.

클래스 종속성 해결 외에도 리소스는 Referencing 프로젝트 gen 디렉토리의 R.java 파일로 직접 참조되고 컴파일됩니다.

사전 ADT 17

Library 프로젝트가 있었다 : 그것은 Library 프로젝트가 참조 된 항아리 등은 "지원"을 추가하기 때문에 사람들에

새로운 ADT 도입 문제의 설정 병이 빌드 경로에 추가되었습니다. Referencing 프로젝트의 자신의 빌드 경로에 jar 파일을 추가 할 수도 있습니다.

ADT (17) 이후

Dealing With Dependencies

동적으로 자신의 항아리를 참조 ADT 17 Library 프로젝트가 이상한 행동을하기 시작 후. 두 개의 범위에서 항아리를 계속 볼 수 있도록하기 위해 Referencing 프로젝트에 동일한 종속 참조를 포함시킨 경우가 아닙니다. 이로 인해 포함 된 클래스가 이상하게 중복되었습니다.

불행히도 Referencing 또는 Library 프로젝트 (단 하나의 링크 만 있음)에서 라이브러리를 제거하면 이클립스가 혼란스럽고 더 이상 프로젝트의 범위에서 jar 파일을 볼 수 없습니다.

이 문제를 해결하려면 /libs 디렉토리에 Library 프로젝트 jar를 두어야합니다.이 경우 jar가 하드 드라이브의 불규칙한 장소에있을 경우 뒤쪽에 아픔이있을 수 있습니다. 이 항아리는 LibraryReferencing 프로젝트에서 자동으로 사용됩니다.

그래서, ADT (17)를지나 이동 :

  • 하지이 현재 프로젝트 범위의 소스로 사용되는 모든 jar 파일을 제거합니다 (이 당신의 Library 또는 Referencing 프로젝트이든).
  • Library 프로젝트에서 "라이브러리"프로젝트를 제거하지 말고 (대신 병으로 컴파일하십시오).
  • Library 프로젝트에서 외부 항아리를 제거한 다음 대신 libs 디렉토리에 복사하십시오.
관련 문제