প্রকৃতপক্ষে, আমার একটি API কলের প্রতিক্রিয়া পাওয়া দরকার, এর জন্য আমার প্রয়োজন Context
।
প্রকৃতপক্ষে, আমার একটি API কলের প্রতিক্রিয়া পাওয়া দরকার, এর জন্য আমার প্রয়োজন Context
।
উত্তর:
হালনাগাদ.
কেবলমাত্র 1.x এবং 2.x সংস্করণটির জন্য ব্যবহার করুন:
Robolectric.application;
এবং সংস্করণ 3.x এর জন্য:
RuntimeEnvironment.application;
এবং সংস্করণ 4.x এর জন্য:
আপনার build.gradle
ফাইল যুক্ত করুন:
testImplementation 'androidx.test:core:1.0.0'
এর সাথে প্রসঙ্গটি পুনরুদ্ধার করুন:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.application
স্ট্যাটিক কোডে ব্যবহার করবেন না (যেমন টীকাগুলি সহ পদ্ধতিগুলি ব্যবহার করা হয়েছে @BeforeClass
) কারণ সম্ভবত রোবলেকট্রিক সেই সময়ে আরম্ভ করা হবে না এবং মানটি হবে null
।
যোগ
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
আর ব্যবহার করুন:
private val app = ApplicationProvider.getApplicationContext()
2019 সালে এখন অবধি সর্বশেষতম রোবলেট্রিকের জন্য 4.3 `
ShadowApplication.getInstance ()
। এবং
Roboletric.application
উভয় অঙ্কিত হয়। তাই আমি ব্যবহার করছি
Context context = RuntimeEnvironment.systemContext;
প্রসঙ্গ পেতে।
আবেদনের প্রসঙ্গটি পেতে আপনাকে নিম্নলিখিতগুলি করতে হবে:
এটি আমার জন্য রোব ইলেক্ট্রিক ৩.৫.১ নিয়ে কাজ করে: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
বা RuntimeEnvironment.application.getApplicationContext()
আপনি তার কাজ।
21 জুলাই 4.0-alpha-3 মুক্তি হিসাবে , তারা সরানো হয়েছে ShadowApplication.getApplicationContext()
। সঙ্গে লাগান RuntimeEnvironment.application.getApplicationContext()
সঙ্গে সটীক কোনো পরীক্ষার জন্য @RunWith(RobolectricTestRunner::class)
।
একদিকে যেমন, তাদের বর্তমান নির্দেশিকায় স্ট্রিং রিসোর্সগুলি ব্যবহার করে উদাহরণ রয়েছে:
final Context context = RuntimeEnvironment.application;
(নোট জন্য javadocs যে RuntimeEnvironment
এবং ShadowApplication
বর্তমানে অ আলফা 3.x মুক্তি প্রতিফলিত করে।)
কিছু ক্ষেত্রে, আপনার রোব ইলেক্ট্রিসের ডিফল্ট প্রসঙ্গের পরিবর্তে আপনার অ্যাপের প্রসঙ্গের প্রয়োজন হতে পারে। উদাহরণস্বরূপ, আপনি যদি নিজের প্যাকেজের নাম পেতে চান। ডিফল্টরূপে রোবলেট্রিক আপনার 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 $ $
সরাসরি ব্যবহার Robolectric.getShadowApplication()
না করে ব্যবহার Robolectric.application
করা নিরাপদ ।
Robolectric.application
@ ইজেনমার্টিনভ এবং @ আরডিএস এর উত্তরগুলির সাথে সম্মত হন ....
ভলি-মার্শমেলো-রিলিজের একটি দ্রুত উদাহরণ পাওয়া যাবে
নেটওয়ার্কআইমেজভিউ টেস্ট.জভাতে
// 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'
}
আপনার ক্ষেত্রে আমি মনে করি আপনি আসলে যা পরীক্ষা করছেন তা আপনার মনে রাখা উচিত। কখনও কখনও অকেটযোগ্য কোড বা আপাতদৃষ্টিতে অকেস্টেবল কোড ইস্যুগুলির মধ্যে চলে যাওয়া এমন একটি চিহ্ন যা সম্ভবত আপনার কোডটিকে পুনরায় সংশোধন করা দরকার।
একটি API কল প্রতিক্রিয়া জন্য আপনি সম্ভবত এপিআই কলটি পরীক্ষা করতে চান না। যে কোনও স্বেচ্ছাসেবক ওয়েব পরিষেবা থেকে তথ্য প্রেরণ / প্রাপ্তি সম্ভব তা পরীক্ষা করার প্রয়োজন হতে পারে না, বরং এটি আপনার কোডটি একটি প্রত্যাশিত ম্যানারে আপনার প্রতিক্রিয়া পরিচালনা করে এবং প্রক্রিয়া করে।
কোন ক্ষেত্রে আপনি যে কোডটি পরীক্ষা করার চেষ্টা করছেন সেটি রিফ্যাক্টর করা ভাল। অন্য কোনও শ্রেণীর কাছে প্রতিক্রিয়া পার্সিং / হ্যান্ডলিং করুন যা একটি সাধারণ গ্রহণ করে String
এবং নমুনা স্ট্রিং প্রতিক্রিয়াগুলি ইনজেকশন দিয়ে সেই শ্রেণিতে আপনার পরীক্ষাটি করে ।
এই বেশী বা কম ধারনা অনুসরণ করছে একক দায়িত্ব এবং নির্ভরতা ইনভার্সান ( এস এবং ডি এ কঠিন )
ঠিক আছে, তাই আমি জানি যে আরও অনেকে এই উত্তরটি আগে বলেছেন এবং ইতিমধ্যে পুরানো হতে পারে
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