আমরা কীভাবে রোব ইলেক্ট্রিকের একটি অ্যাপ্লিকেশন প্রসঙ্গে অ্যাক্সেস করতে পারি?


112

প্রকৃতপক্ষে, আমার একটি API কলের প্রতিক্রিয়া পাওয়া দরকার, এর জন্য আমার প্রয়োজন Context

উত্তর:


218

হালনাগাদ.

কেবলমাত্র 1.x এবং 2.x সংস্করণটির জন্য ব্যবহার করুন:

Robolectric.application;

এবং সংস্করণ 3.x এর জন্য:

RuntimeEnvironment.application;

এবং সংস্করণ 4.x এর জন্য:

  • আপনার build.gradleফাইল যুক্ত করুন:

    testImplementation 'androidx.test:core:1.0.0'
    
  • এর সাথে প্রসঙ্গটি পুনরুদ্ধার করুন:

    ApplicationProvider.getApplicationContext()
    

11
আপনি কি আপনার পরীক্ষার জন্য @ রনউইথ (রোবলেট্রিকটেষ্টরুনার.ক্লাস) রেখেছেন?
ইউজেন মার্টিনভ

4
হ্যাঁ .. আমি যোগ করেছি ... তবে তবুও এটি বাতিল হয়ে যায়
user1667968

1
আপনি যা উল্লেখ করেছেন তার সবই আমি করেছি এবং এখনও শূন্য হয়ে পড়েছি। আমি আর কিছু মিস করছি?
মোয়েসেস জিমনেজ

13
এছাড়াও নিশ্চিত করুন যে আপনি RuntimeEnvironment.applicationস্ট্যাটিক কোডে ব্যবহার করবেন না (যেমন টীকাগুলি সহ পদ্ধতিগুলি ব্যবহার করা হয়েছে @BeforeClass) কারণ সম্ভবত রোবলেকট্রিক সেই সময়ে আরম্ভ করা হবে না এবং মানটি হবে null
sfera

1
এছাড়াও এটি পরীক্ষার মধ্যে অ্যাপ্লিকেশনটি রক্তক্ষরণের কারণ হয়ে দাঁড়ায় .. যা কাঙ্ক্ষিত নাও হতে পারে
ক্রিস

26

তুমি ব্যবহার করতে পার

RuntimeEnvironment.application

4
রোব ইলেকট্রিক 3.0.০ এ, রোবইলেক্ট্রিক. অ্যাপ্লিকেশনটি আর বিদ্যমান নেই, সুতরাং এটি সম্ভবত সেরা উত্তর
কেনেই


16

যোগ

testImplementation "androidx.test:core-ktx:${deps.testrunner}"

আর ব্যবহার করুন:

private val app = ApplicationProvider.getApplicationContext()

আমদানি androidx.test.core.app.
আবেদন

Val appContext = ApplicationProvider.getApplicationContext <প্রসঙ্গ> ()
luckyhandler

2
সর্বশেষতম রোবলেট্রিকের সাথে এটি সঠিক উত্তর। এখানে উল্লিখিত অন্যান্য পদ্ধতি অবচয় বা সরানো হয়েছে।
গ্যাবর

7

2019 সালে এখন অবধি সর্বশেষতম রোবলেট্রিকের জন্য 4.3 `

ShadowApplication.getInstance ()

। এবং

Roboletric.application

উভয় অঙ্কিত হয়। তাই আমি ব্যবহার করছি

Context context = RuntimeEnvironment.systemContext;

প্রসঙ্গ পেতে।


5

আবেদনের প্রসঙ্গটি পেতে আপনাকে নিম্নলিখিতগুলি করতে হবে:

  1. @ রুনউইথ টিকা দিন (রোবলেট্রিকটেষ্টরুনার.ক্লাস)
  2. RuntimeEnvironment.application.getApplicationContext ()

2

এটি আমার জন্য রোব ইলেক্ট্রিক ৩.৫.১ নিয়ে কাজ করে: ShadowApplication.getInstance().applicationContext


মনে রাখবেন যে 4.0 রিলিজ দেখে মনে হচ্ছে এটি এই পদ্ধতিটি সরিয়ে ফেলবে; ভাল দিয়ে বিদ্ধ করার RuntimeEnvironment.applicationবা RuntimeEnvironment.application.getApplicationContext()আপনি তার কাজ।
কিউস

2

21 জুলাই 4.0-alpha-3 মুক্তি হিসাবে , তারা সরানো হয়েছে ShadowApplication.getApplicationContext() । সঙ্গে লাগান RuntimeEnvironment.application.getApplicationContext()সঙ্গে সটীক কোনো পরীক্ষার জন্য @RunWith(RobolectricTestRunner::class)

একদিকে যেমন, তাদের বর্তমান নির্দেশিকায় স্ট্রিং রিসোর্সগুলি ব্যবহার করে উদাহরণ রয়েছে:

final Context context = RuntimeEnvironment.application;

(নোট জন্য javadocs যে RuntimeEnvironmentএবং ShadowApplicationবর্তমানে অ আলফা 3.x মুক্তি প্রতিফলিত করে।)


2

প্রথমে আপনার সাথে নিম্নলিখিতগুলি যুক্ত করুন build.gradle:

testImplementation 'androidx.test:core:1.2.0'

তারপরে ব্যবহার করুন:

ApplicationProvider.getApplicationContext() as Application


2

কিছু ক্ষেত্রে, আপনার রোব ইলেক্ট্রিসের ডিফল্ট প্রসঙ্গের পরিবর্তে আপনার অ্যাপের প্রসঙ্গের প্রয়োজন হতে পারে। উদাহরণস্বরূপ, আপনি যদি নিজের প্যাকেজের নাম পেতে চান। ডিফল্টরূপে রোবলেট্রিক আপনার org.robolectric.defaultপ্যাকেজের নাম ফিরিয়ে দেবে । আপনার আসল প্যাকেজের নামটি পেতে নিম্নলিখিত কাজগুলি করুন:

build.gradle

testImplementation 'org.robolectric:robolectric:4.2.1'

আপনার পরীক্ষার শ্রেণি:

@RunWith(RobolectricTestRunner.class)
@Config( manifest="AndroidManifest.xml")
public class FooTest {

@Test
public void fooTestWithPackageName(){
    Context context = ApplicationProvider.getApplicationContext();
    System.out.println("My Real Package Name: " + context.getPackageName());
}

}

আপনার রান / ডিবাগ কনফিগারেশনগুলিতে কার্যকারী ডিরেক্টরিটি সেট করা আছে তা নিশ্চিত করুন: $ MODULE_DIR $ $ এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


1

সরাসরি ব্যবহার Robolectric.getShadowApplication()না করে ব্যবহার Robolectric.applicationকরা নিরাপদ ।


তবে আমার কাস্টম অ্যাপ্লিকেশনের কিছু কাস্টম বৈশিষ্ট্য অ্যাক্সেস করার দরকার হলে কী হবে? মনে হচ্ছে ছায়া অ্যাপ্লিকেশন থেকে আমি আসল বস্তুটি পেতে পারি না।
ডেনিস নাইয়াজেভ

@ ডেনিসকিনিয়াজেভ দুঃখিত, আমি আপনার জন্য উত্তরটি দিতে পারছি না। আমরা রোবলেট্রিক ব্যবহার শুরু করার অল্পক্ষণের পরে আমরা ট্র্যাভিসকে আমাদের সিআই হিসাবে ব্যবহার শুরু করি, এবং তারা দুর্দান্ত খেলছে না। আমার ধারণা হ'ল আপনি এটি আপনার অ্যাপ্লিকেশনটিতে কাস্ট করতে পারেন বা সেভাবে অ্যাক্সেস পাওয়ার জন্য আপনাকে কাস্টম রানার তৈরি করতে হবে। শুভকামনা
drspaceboo

ধন্যবাদ, আপাতত আমি আটকে Robolectric.application
গিয়েছি

6
রোবলেট্রিক.জেটশ্যাডো অ্যাপ্লিকেশন () উপলভ্য নয়
ইগোরগানাপলস্কি

1

@ ইজেনমার্টিনভ এবং @ আরডিএস এর উত্তরগুলির সাথে সম্মত হন ....

ভলি-মার্শমেলো-রিলিজের একটি দ্রুত উদাহরণ পাওয়া যাবে

নেটওয়ার্কআইমেজভিউ টেস্ট.জভাতে

// mNIV = new NetworkImageView(Robolectric.application); mNIV = new NetworkImageView(RuntimeEnvironment.application);

ভলির লিঙ্কটি https://android.googlesource.com/platform/frameworks/volley/+/marshmallow- রিলিজ উপলভ্য

অ্যান্ড্রয়েড স্টুডিওতে ভল্লি মডিউলে আপনাকে নির্ভরতা যুক্ত করতে হবে:

dependencies { testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'org.robolectric:robolectric:3.1.2' }


1

আপনার ক্ষেত্রে আমি মনে করি আপনি আসলে যা পরীক্ষা করছেন তা আপনার মনে রাখা উচিত। কখনও কখনও অকেটযোগ্য কোড বা আপাতদৃষ্টিতে অকেস্টেবল কোড ইস্যুগুলির মধ্যে চলে যাওয়া এমন একটি চিহ্ন যা সম্ভবত আপনার কোডটিকে পুনরায় সংশোধন করা দরকার।

একটি API কল প্রতিক্রিয়া জন্য আপনি সম্ভবত এপিআই কলটি পরীক্ষা করতে চান না। যে কোনও স্বেচ্ছাসেবক ওয়েব পরিষেবা থেকে তথ্য প্রেরণ / প্রাপ্তি সম্ভব তা পরীক্ষা করার প্রয়োজন হতে পারে না, বরং এটি আপনার কোডটি একটি প্রত্যাশিত ম্যানারে আপনার প্রতিক্রিয়া পরিচালনা করে এবং প্রক্রিয়া করে।

কোন ক্ষেত্রে আপনি যে কোডটি পরীক্ষা করার চেষ্টা করছেন সেটি রিফ্যাক্টর করা ভাল। অন্য কোনও শ্রেণীর কাছে প্রতিক্রিয়া পার্সিং / হ্যান্ডলিং করুন যা একটি সাধারণ গ্রহণ করে Stringএবং নমুনা স্ট্রিং প্রতিক্রিয়াগুলি ইনজেকশন দিয়ে সেই শ্রেণিতে আপনার পরীক্ষাটি করে

এই বেশী বা কম ধারনা অনুসরণ করছে একক দায়িত্ব এবং নির্ভরতা ইনভার্সান ( এস এবং ডিকঠিন )


1

ঠিক আছে, তাই আমি জানি যে আরও অনেকে এই উত্তরটি আগে বলেছেন এবং ইতিমধ্যে পুরানো হতে পারে

    when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
    when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());

    sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
    sut = new BundleManagerImpl(mockApplication,
            processHtmlBundle, resultListener, sharedPref);

আমি নালু হয়ে গেলাম, কারণ যখন () অংশটি সট ইনিশিয়েশনের পরে ছিল। এটি আপনার কয়েকজনকে সাহায্য করতে পারে।

আমিও

@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)

ক্লাসের শুরুতে

এছাড়াও

 when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.