10

मैं एंड्रॉइड मार्शमलो ऐप पर यूनिट परीक्षणों के लिए इसका उपयोग करने के लिए रोबोलेक्ट्रिक सीखना चाहता हूं। मैंने कुछ आसान तरीकों से अनुमति देने के लिए PermissionHelper लिखा था। (मार्शमलो अनुमति के लिए एंड्रॉइड रोबोलेक्ट्रिक यूनिट टेस्ट हैल्पर

@RunWith(RobolectricTestRunner.class) 
@Config(constants = BuildConfig.class) 
public class PermissionHelperTest { 

    private PermissionHelper permissionHelper; 
    private ShadowApplication application; 

    @Before 
    public void setup() { 
     PictureActivity activity = Robolectric.buildActivity(PictureActivity.class).get(); 
     permissionHelper = new PermissionHelper(activity, activity, 1); 
     application = new ShadowApplication(); 
    } 

    @Test 
    public void testHasPermission() throws Exception { 
     String[] permissions = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}; 
     boolean hasPermissions = permissionHelper.hasPermissions(permissions); 
     Assert.assertEquals(false, hasPermissions); 

     application.grantPermissions(permissions); 
     hasPermissions = permissionHelper.hasPermissions(permissions); 
     Assert.assertEquals(true, hasPermissions); 
    } 
} 

पहले जोर काम करता है:

public static boolean hasPermissions(Activity activity, String[] permissions) { 
    for (String permission : permissions) { 
     int status = ActivityCompat.checkSelfPermission(activity, permission); 
     if (status == PackageManager.PERMISSION_DENIED) { 
      return false; 
     } 
    } 
    return true; 
} 

यहाँ Robolectric परीक्षण है कि मैं अब तक लिखा है: इस वर्ग के लिए इकाई परीक्षण के साथ आरंभ करने के लिए, मैं सबसे सरल विधि का परीक्षण करने के कोशिश कर रहा हूँ कोई अनुमति नहीं दी गई)। लेकिन छाया अनुप्रयोग के माध्यम से सभी अनुमतियां देने के बाद भी उन्हें अगले आर्ट में अस्वीकार कर दिया जाता है।

मुझे लगता है कि PictureActivityRobolectric.buildActivity() के साथ बनाया गया अनुमति अनुमति के लिए छाया अनुप्रयोग का उपयोग नहीं कर रहा है। लेकिन PictureActivity.getApplication() मुझे grantPermissions पर कॉल करने के लिए ShadowApplication नहीं देता है। मैं इसका परीक्षण कैसे कर सकता हूं?

मैं एंड्रॉइड पर रोबोलेक्ट्रिक और यूनिट परीक्षण के लिए नया हूं ... इसलिए यदि कोई अन्य ढांचा है जो इसे आसान/संभव बनाता है: मैं सुझावों के लिए खुला हूं।

उत्तर

6

आपकी समस्या यह है कि आप अनुमति देने के लिए एक अलग एप्लिकेशन का उपयोग कर रहे हैं, न कि स्वयं।

इसके बजाय इस बात का

:

application = new ShadowApplication(); 

आप अपने आवेदन की छाया, इस तरह मिलना चाहिए:

application = Shadows.shadowOf(activity.getApplication()); 
+0

हां, यह काम किया! धन्यवाद। परिवर्तन के बाद मुझे एक और त्रुटि मिली कि एंड्रॉइड एचटीपी क्लाइंट गुम है, लेकिन यह एक आसान फिक्स है जिस पर चर्चा की गई है: https://github.com/robolectric/robolectric/issues/1862 – muetzenflo

7
इसके बजाय ActivityCompat मैं ContextCompat.checkSelfPermission() जो एक संदर्भ प्राप्त करता है उपयोग कर रहा हूँ का उपयोग करने का

, तो संदर्भ का एक नकली भेजें और अनुमति की अनुमति दें, यह हमारे लिए काम है:

बजाय:

ActivityCompat.checkSelfPermission(activity, permission); 

उपयोग

ContextCompat.checkSelfPermission(context, permission); 

तो अपने पाठ में आप एक नकली सीधे अपने hasPermissions विधि करने के लिए भेजने के लिए और के रूप में परिणाम ठूंठ कर सकते हैं:

Context context = mock(Context.class); 
when(context.checkPermission(eq("YOUR_PERMISSION"),anyInt(),anyInt())).thenReturn(
    PackageManager.PERMISSION_GRANTED); 
+0

** मॉकिटो **, या ** रोबोलेक्ट्रिक का यह हिस्सा है ** –

+1

कौन सा हिस्सा? 'ContextCompat' एंड्रॉइड समर्थन पैकेज का हिस्सा है और शेष नियमित मॉकिटो है – JavierSP1209

संबंधित मुद्दे