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 

बिल्डिंग एकदम सही काम करता है और परीक्षण सही चलाता है, भी।

यदि मैं लाइब्रेरी प्रोजेक्ट को अपनी टेस्ट प्रोजेक्ट से लिंक करता हूं, तो यह चींटी से संकलित होता है लेकिन परीक्षण विफल हो जाते हैं।

[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); 
    } 
} 

कुछ विचार कैसे मैं इसे ठीक कर सकते हैं?

अद्यतन: ऐसा लगता है कि चींटी निर्माण/परीक्षण अभी भी एक गड़बड़ है। इस ब्लॉग प्रविष्टि के अनुसार testing a library project 7 सूचीबद्ध मुद्दों में से अधिकांश अगले एडीटी रिलीज (एडीटी आर 20) में तय किए जाएंगे।

उत्तर

7

Library परियोजनाओं का उपयोग करने के बारे में जानकारी के बहुत सारे बिट्स हैं जो एडीटी 17 तोड़ने/निश्चित सब कुछ तय कर चुके हैं (गीलेर के आधार पर आप वर्तमान में अपने डेस्क के खिलाफ अपने सिर को टक्कर दे रहे हैं)।

सबसे पहले, कृपया Library और "लाइब्रेरी" के बीच का अंतर ध्यान दें जहां Library एंड्रॉइड टीम द्वारा नियुक्त एक संज्ञा है। मैं Referencing प्रोजेक्ट का भी उपयोग कर रहा हूं जो एक परियोजना का वर्णन करता है जो Library प्रोजेक्ट का उपयोग करता है।

यानी, Referencing प्रोजेक्ट Library प्रोजेक्ट का उपयोग करता है।

गैर Library "पुस्तकालय" परियोजनाओं

सामान्य जावा विकास में यह ग्रहण में परियोजनाओं से जोड़ने के लिए जहां एक अन्य के स्रोत पर निर्भर है संभव है। मेरा मानना ​​है कि इस दृष्टिकोण के पास संदर्भ परियोजना के स्रोत के रूप में लाइब्रेरी प्रोजेक्ट स्रोतों का उपयोग करने का प्रभाव है। इसका मतलब है कि संदर्भ परियोजना को संकलित करते समय पुस्तकालय परियोजना स्रोत गुंजाइश में है। लाइब्रेरी प्रोजेक्ट क्लासेस एक ही समय में संदर्भ परियोजना के रूप में बनाए जाते हैं।

अधिकांश स्थितियों में उपयोग के लिए निर्माण करते समय यह पूरी तरह से अच्छी तरह से काम करता है क्योंकि सभी वर्गों का निर्माण किया जाता है और फिर जेएआरएस या वार्स या जो कुछ भी पैक किया जाता है।

लाइब्रेरी परियोजनाओं

पुस्तकालय परियोजनाओं के लिए एक प्रतिस्पर्धा (नहीं मिश्रण और मैच) दृष्टिकोण एंड्रॉयड टीमों Library परियोजनाओं हैं:

एक Android परियोजना एक Library परियोजना संकलन होगा जा रहा है के रूप में चिह्नित और jar फ़ाइल में bin निर्देशिका (क्लीन/बिल्ड कमांड के बाद) में इसका स्रोत बनाएं। कोई भी Referencing प्रोजेक्ट स्वचालित रूप से इस jar आयात कर रहा है और Library परियोजना कार्यक्षमता तक पहुंच प्राप्त कर रहा है। आप पैकेज एक्सप्लोरर में जावा लाइब्रेरी Android Dependencies के अंदर देखकर इस रिश्ते को देख सकते हैं।

वर्ग निर्भरता संकल्प संसाधन भी सीधे जिक्र किया गया और Referencing परियोजनाओं gen निर्देशिका के अंदर R.java फ़ाइलों में संकलित किया जा रहा है के साथ।

पूर्व एडीटी 17

Library परियोजना एक था: क्योंकि यह "समर्थन" जार जो Library परियोजना द्वारा संदर्भित कर रहे थे सहित के लिए जोड़ा

नई ADT लोगों के लिए शुरू की समस्याओं का सेट अप जार ने इसके निर्माण पथ में जोड़ा। Referencing प्रोजेक्ट में जार भी अपने बिल्ड पथ में जोड़ा जा सकता है।

एडीटी 17 के बाद

Dealing With Dependencies

बाद एडीटी 17 Library परियोजनाएं हैं जो गतिशील रूप से अपने स्वयं के जार संदर्भित अजीब तरीके से व्यवहार करना शुरू कर दिया। जार को दोनों स्कॉप्स में दिखाई देने के लिए यह आपके Referencing प्रोजेक्ट में समान निर्भर संदर्भ शामिल करने का मामला नहीं था। अब इसके परिणामस्वरूप कक्षाओं के अजीब नकल में परिणाम हुआ।

दुर्भाग्य से बस Referencing या Library परियोजना से पुस्तकालय को हटाने (ताकि केवल एक लिंक मौजूद थे) तो उलझन में ग्रहण, यह अब परियोजना के दायरे का उपयोग करने से जार देख सकते हैं सकता है।

इसे ठीक करने के लिए आपको प्रोजेक्ट जार /libs निर्देशिका में रखने की आवश्यकता है - यदि आप अपने हार्डड्राइव पर असरदार स्थानों पर जार हैं तो यह पीछे की ओर दर्द हो सकता है। इन जारों का स्वचालित रूप से आपके Library और Referencing प्रोजेक्ट्स में उपयोग किया जाएगा।

इसलिए, पिछले एडीटी 17 स्थानांतरित करने के लिए:

  • किसी भी जार फ़ाइलें निकालें नहीं मौजूदा परियोजनाओं के दायरे में एक स्रोत के रूप में इस्तेमाल किया जा रहा है (यह आपका Library या Referencing परियोजना हो या नहीं)।
  • अपने Library प्रोजेक्ट से किसी भी "लाइब्रेरी" प्रोजेक्ट को निकालें (इसके बजाय उन्हें जार में संकलित करें)।
  • अपने Library प्रोजेक्ट से बाहरी जार निकालें, उन्हें libs निर्देशिका में कॉपी करें।
संबंधित मुद्दे