Robolectric 3.2.2 获取影子实例类?
Robolectric 3.2.2 get instance of shadow classes?
我已经在我的 android 应用程序上实现了 MVP,并且正在考虑创建测试脚本来测试基本行为功能。长话短说,有没有办法获取我创建的影子对象的实例?
我希望能够在方法中告诉模拟模型对象 return 什么,例如,当调用 getGender() 时,return 男性,但对于另一种方法, getGender() 将 return 女性。
我现在已经想办法去做了,但我对模型的设计很幸运。这是测试:
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 22, shadows = { GenderPreferenceInteractorShaddow.class })
public class newPreferenceBehaviourTest {
@Test
public void clickingLogin_shouldStartLoginActivity() {
NewPreferenceMobileActivityTest activity = Robolectric.setupActivity(NewPreferenceMobileActivityTest.class);
activity.setGender(Gender.MALE);
activity.findViewById(R.id.femaleImageButton).performClick();
activity.findViewById(R.id.positiveButton).performClick();
}
}
模型构造函数将上下文作为构造,因此我可以创建一个测试 activity,它扩展了我要测试的 activity。
public class NewPreferenceMobileActivityTest extends NewPreferenceMobileActivity {
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
private Gender gender;
}
这个新模型将包含 getter 和 setter 作为我要更改的值。在阴影对象的构造函数中,我可以将上下文转换为测试 activity,然后模拟模型的 getter 可以 return 我想要的:
@Implements(GenderPreferenceInteractor.class)
public class GenderPreferenceInteractorShaddow {
private NewPreferenceMobileActivityTest newPreferenceMobileActivityTest;
private GenderPreferenceMVP.onFinished onFinished;
public void __constructor__ (Context context) {
newPreferenceMobileActivityTest = (NewPreferenceMobileActivityTest) context;
}
@Implementation
public void saveGender(Gender gender) {
onFinished.onSaveSuccess(true);
}
@Implementation
public Gender getGender()
{
return newPreferenceMobileActivityTest.getGender();
}
}
编辑 --> 不可能,但有一个解决方法。在 GenderPreferenceInteractorShaddow class 中,将引用传递回 NewPreferenceMobileActivityTest class 并且我们有对 class.
的引用
public void __constructor__ (Context context) {
newPreferenceMobileActivityTest = (NewPreferenceMobileActivityTest) context;
newPreferenceMobileActivityTest.setGenderPreferenceInteractorShaddow(this);
}
public class NewPreferenceMobileActivityTest extends NewPreferenceMobileActivity {
private GenderPreferenceInteractorShaddow genderPreferenceInteractorShaddow;
public ladenzeile.android.newPreference.GenderPreferenceInteractorShaddow getGenderPreferenceInteractorShaddow() {
return genderPreferenceInteractorShaddow;
}
public void setGenderPreferenceInteractorShaddow(ladenzeile.android.newPreference.GenderPreferenceInteractorShaddow genderPreferenceInteractorShaddow) {
this.genderPreferenceInteractorShaddow = genderPreferenceInteractorShaddow;
这样做的缺点是您需要将性别变量设置为默认值
您可以像这样使用 ShadowExtractor:
GenderPreferenceInteractorShaddow shadowGender = (GenderPreferenceInteractorShaddow) ShadowExtractor.extract(genderPreferenceInteractor);
我已经在我的 android 应用程序上实现了 MVP,并且正在考虑创建测试脚本来测试基本行为功能。长话短说,有没有办法获取我创建的影子对象的实例?
我希望能够在方法中告诉模拟模型对象 return 什么,例如,当调用 getGender() 时,return 男性,但对于另一种方法, getGender() 将 return 女性。
我现在已经想办法去做了,但我对模型的设计很幸运。这是测试:
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 22, shadows = { GenderPreferenceInteractorShaddow.class })
public class newPreferenceBehaviourTest {
@Test
public void clickingLogin_shouldStartLoginActivity() {
NewPreferenceMobileActivityTest activity = Robolectric.setupActivity(NewPreferenceMobileActivityTest.class);
activity.setGender(Gender.MALE);
activity.findViewById(R.id.femaleImageButton).performClick();
activity.findViewById(R.id.positiveButton).performClick();
}
}
模型构造函数将上下文作为构造,因此我可以创建一个测试 activity,它扩展了我要测试的 activity。
public class NewPreferenceMobileActivityTest extends NewPreferenceMobileActivity {
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
private Gender gender;
}
这个新模型将包含 getter 和 setter 作为我要更改的值。在阴影对象的构造函数中,我可以将上下文转换为测试 activity,然后模拟模型的 getter 可以 return 我想要的:
@Implements(GenderPreferenceInteractor.class)
public class GenderPreferenceInteractorShaddow {
private NewPreferenceMobileActivityTest newPreferenceMobileActivityTest;
private GenderPreferenceMVP.onFinished onFinished;
public void __constructor__ (Context context) {
newPreferenceMobileActivityTest = (NewPreferenceMobileActivityTest) context;
}
@Implementation
public void saveGender(Gender gender) {
onFinished.onSaveSuccess(true);
}
@Implementation
public Gender getGender()
{
return newPreferenceMobileActivityTest.getGender();
}
}
编辑 --> 不可能,但有一个解决方法。在 GenderPreferenceInteractorShaddow class 中,将引用传递回 NewPreferenceMobileActivityTest class 并且我们有对 class.
的引用public void __constructor__ (Context context) {
newPreferenceMobileActivityTest = (NewPreferenceMobileActivityTest) context;
newPreferenceMobileActivityTest.setGenderPreferenceInteractorShaddow(this);
}
public class NewPreferenceMobileActivityTest extends NewPreferenceMobileActivity {
private GenderPreferenceInteractorShaddow genderPreferenceInteractorShaddow;
public ladenzeile.android.newPreference.GenderPreferenceInteractorShaddow getGenderPreferenceInteractorShaddow() {
return genderPreferenceInteractorShaddow;
}
public void setGenderPreferenceInteractorShaddow(ladenzeile.android.newPreference.GenderPreferenceInteractorShaddow genderPreferenceInteractorShaddow) {
this.genderPreferenceInteractorShaddow = genderPreferenceInteractorShaddow;
这样做的缺点是您需要将性别变量设置为默认值
您可以像这样使用 ShadowExtractor:
GenderPreferenceInteractorShaddow shadowGender = (GenderPreferenceInteractorShaddow) ShadowExtractor.extract(genderPreferenceInteractor);