อันที่จริงผมจำเป็นต้องได้รับการตอบสนองของการเรียก 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
) เป็น Robolectric null
อาจจะไม่สามารถเริ่มต้นที่จุดนั้นและความคุ้มค่าที่จะเป็น
คุณสามารถใช้ได้
RuntimeEnvironment.application
ใช้สิ่งนี้:
Robolectric.application
เพิ่ม
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
และใช้:
private val app = ApplicationProvider.getApplicationContext()
สำหรับ Robolectric 4.3 ล่าสุด ณ ตอนนี้ในปี 2019 "
ShadowApplication.getInstance ()
`และ
Roboletric.application
ถูกกีดกันทั้งคู่ ดังนั้นฉันใช้
Context context = RuntimeEnvironment.systemContext;
เพื่อรับบริบท
ในการรับบริบทแอปพลิเคชันคุณต้องทำสิ่งต่อไปนี้:
สิ่งนี้ใช้ได้กับฉันกับ Robolectric 3.5.1: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
หรือ RuntimeEnvironment.application.getApplicationContext()
ถ้ามันทำงานให้คุณ
ในฐานะของการเปิดตัว 4.0-alpha-3ในวันที่ 21 กรกฏาคมที่พวกเขาเอาออก ShadowApplication.getApplicationContext()
Stick ที่มีRuntimeEnvironment.application.getApplicationContext()
สำหรับการทดสอบข้อเขียนใด ๆ @RunWith(RobolectricTestRunner::class)
กับ
นอกจากนี้คู่มือปัจจุบันยังมีตัวอย่างของการรับทรัพยากรสตริงโดยใช้:
final Context context = RuntimeEnvironment.application;
(โปรดทราบว่า javadocs สำหรับRuntimeEnvironment
และShadowApplication
ปัจจุบันสะท้อนถึงรุ่นที่ไม่ใช่ alpha 3.x)
ขั้นแรกให้เพิ่มสิ่งต่อไปนี้ในของคุณbuild.gradle
:
testImplementation 'androidx.test:core:1.2.0'
จากนั้นใช้:
ApplicationProvider.getApplicationContext() as Application
ในบางกรณีคุณอาจต้องใช้บริบทของแอปแทนบริบทเริ่มต้นของ Robolectris ตัวอย่างเช่นหากคุณต้องการรับชื่อแพ็กเกจของคุณ ตามค่าเริ่มต้น Robolectric จะส่งคืน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());
}
}
ตรวจสอบให้แน่ใจว่าในไดเร็กทอรี Run / Debug Configurations Working ของคุณถูกตั้งค่าเป็น: $ MODULE_DIR $
ปลอดภัยกว่าที่จะใช้Robolectric.getShadowApplication()
แทนการใช้Robolectric.application
โดยตรง
Robolectric.application
เห็นด้วยกับคำตอบของ @EugenMartynov และ @rds ....
สามารถดูตัวอย่างสั้น ๆ ได้ที่ Volley-Marshmallow-Release
ใน NetworkImageViewTest.java
// mNIV = new NetworkImageView(Robolectric.application);
mNIV = new NetworkImageView(RuntimeEnvironment.application);
ลิงค์วอลเลย์สามารถใช้ได้ https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release
คุณต้องเพิ่มการอ้างอิงในโมดูลวอลเลย์ใน android studio เป็น:
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
testCompile 'org.robolectric:robolectric:3.1.2'
}
ในกรณีของคุณฉันคิดว่าคุณควรคำนึงถึงสิ่งที่คุณกำลังทดสอบอยู่จริงๆ บางครั้งการทำงานในเรื่องของการuntestableรหัสหรือโค้ด untestable ดูเหมือนจะเป็นสัญญาณว่าอาจจะรหัสของคุณจะต้อง refactored
สำหรับการตอบกลับการเรียก API คุณอาจไม่ต้องการทดสอบการเรียก API เอง อาจไม่จำเป็นต้องทดสอบว่าเป็นไปได้ที่จะส่ง / รับข้อมูลจากบริการเว็บใด ๆ โดยพลการ แต่รหัสของคุณจะจัดการและประมวลผลคำตอบของคุณในคฤหาสน์ที่คาดหวัง
ซึ่งในกรณีนี้อาจเป็นการดีกว่าที่จะ refactor โค้ดที่คุณพยายามทดสอบ แยกการแยกวิเคราะห์การตอบกลับ / การจัดการไปยังคลาสอื่นซึ่งยอมรับแบบง่ายString
และทำการทดสอบของคุณในคลาสนั้นโดยการฉีดการตอบกลับสตริงตัวอย่าง
สิ่งนี้จะมากหรือน้อยตามแนวคิดเรื่องSingle Responsibility and Dependency Inversion (The S and D in SOLID )
โอเคฉันรู้ว่าคนอื่น ๆ พูดคำตอบนี้มาก่อนและอาจล้าสมัยไปแล้ว
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);
ฉันได้ค่าว่างเนื่องจากส่วนเมื่อ () อยู่หลังจากการเริ่มต้น sut อาจช่วยคุณได้บ้าง
ฉันยังมีไฟล์
@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
ที่จุดเริ่มต้นของชั้นเรียน
นอกจากนี้
when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works