2013-01-07 10 views
7

का उपयोग कर मैं एंड्रॉइड परीक्षण के लिए नया हूं और मैं एक मॉककॉन्टेक्स्ट का उपयोग करके एक एप्लीकेशन टेस्टकेस बनाने की कोशिश कर रहा हूं (वास्तव में मैं एक रेनमिंग मॉक संदर्भ का उपयोग करने की कोशिश कर रहा हूं)। लेकिन मैं एक AssertionFailedError मिल रहा है।एंड्रॉइड एप्लिकेशनटेस्टकेस एक मॉककॉन्टेक्स्ट

AppTests.java

package com.myProject.test; 

import android.test.ApplicationTestCase; 

public class AppTests extends ApplicationTestCase<MyApplication> { 
    public AppTests() { 
     super(MyApplication.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     final RenamingMockContext mockContext = new RenamingMockContext(getContext()); 
     setContext(mockContext); 
     createApplication(); 
    } 

} 

MyApplication.java

package com.myProject.test; 

import android.app.Application; 

public class MyApplication extends Application { 

    public MyApplication() { 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

} 

RenamingMockContext.java

package com.myProject.test; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.test.RenamingDelegatingContext; 
import android.test.mock.MockContext; 

public class RenamingMockContext extends RenamingDelegatingContext { 

    private static final String PREFIX = "test."; 

    public RenamingMockContext(Context context) { 
     super (new DelegatedMockContext(context), PREFIX); 
     //super(context, PREFIX); 
    } 

    private static class DelegatedMockContext extends MockContext { 
     private Context mDelegatedContext; 
     public DelegatedMockContext(Context context) { 
      mDelegatedContext = context; 
     } 

     @Override 
     public String getPackageName() { 
      return mDelegatedContext.getPackageName(); 
     } 

     @Override 
     public SharedPreferences getSharedPreferences(
      String name, int mode) { 
      return mDelegatedContext.getSharedPreferences(
      PREFIX + name, mode); 
     } 

    } 

} 

विफलता ट्रेस::

junit.framework.AssertionFailedError 
at android.test.ApplicationTestCase.setupApplication(ApplicationTestCase.java:102) 
at android.test.ApplicationTestCase.createApplication(ApplicationTestCase.java:118) 
at com.myApplication.test.AppTests.setUp(AppTests.java:14) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1710) 
0 यहाँ मेरी बहुत ही बुनियादी कोड अब तक है

ध्यान दें कि अगर मैं RenamingMockContext कन्स्ट्रक्टर में दूसरी सुपर() कॉल का उपयोग करता हूं, तो टिप्पणी की गई है (इसलिए विस्तृत MockContext क्लास का उपयोग न करें) यह ठीक काम करता है।

यहां एक संदर्भ UnsupportedOperationException while calling getSharedPreferences() from unit test है जो मेरे लिए काम नहीं करता है, और मैंने एंड्रॉइड एप्लिकेशन टेस्टिंग गाइड को भी पढ़ा है, जो इस तरह एक उदाहरण देता है, लेकिन जब मैंने स्रोत डाउनलोड किया और इसे सीधे चलाया तो यह वही दिया त्रुटि।

+0

मैं ContextWrapper का विस्तार करके इस हल:

सेटअप विधि के कुछ लाइनों परीक्षण काम कर पाने के लिए टिप्पणी की जानी चाहिए। मेरा जवाब यहां देखें - http://stackoverflow.com/a/19710382/201113 – barry

उत्तर

2

मैंने एंड्रॉइड टेस्टकेस का उपयोग एक साधारण संदर्भ के लिए किया है।

class ExampleTest extends AndroidTestCase 
    public void setUp() { 
     Context c = new DelegatedMockContext(getContext()) 
    } 

    class DelegatedMockContext extends MockContext { 

    private Context mDelegatedContext; 
     private static final String PREFIX = "test."; 

     public DelegatedMockContext(Context context) { 
      mDelegatedContext = context; 
     } 

     @Override 
     public String getPackageName(){ 
      return PREFIX; 
     } 

     @Override 
     public SharedPreferences getSharedPreferences(String name, int mode) { 
      return mDelegatedContext.getSharedPreferences(name, mode); 
     } 
    } 
} 

इसका सिर्फ एक दलदल मानक संदर्भ है, लेकिन आप

4

जा रहा है कि इस पुस्तक नमूना के लिए एक समाधान के रूप में देखने के ApplicationTestCase को एंड्रॉयड डेवलपर गाइड मिल जाएगा: "बस अपने परीक्षण चलाते हैं के रूप में है, अपने एप्लिकेशन को पूरी तरह से कार्यात्मक संदर्भ के साथ इंजेक्शन दिया जाएगा "(http://developer.android.com/reference/android/test/ApplicationTestCase.html)।

protected void setUp() throws Exception 
    { 
     super.setUp(); 
     // final RenamingMockContext mockContext = new RenamingMockContext(
     // getContext()); 
     // setContext(mockContext); 

     createApplication(); 
     mApplication = getApplication(); 
    } 
संबंधित मुद्दे