2017-02-28 39 views
1

我已经在我的android应用程序上实现了MVP,并且正在创建测试脚本来测试基本行为功能。长话短说,有没有办法让我创建的阴影对象的实例?Robolectric 3.2.2获取影子类的实例?

我希望能够告诉模拟模型对象在方法中返回什么,例如,当调用getGender()时,返回Male,但对于另一种方法,getGender()将返回Female。

我现在已经找到了,但我很幸运,模型的设计。这是测试:

@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(); 
    } 


} 

模型构造也需要上下文的结构,这样我就可以创建一个测试活动,延伸我想测试活动。

public class NewPreferenceMobileActivityTest extends NewPreferenceMobileActivity { 
    public Gender getGender() { 
     return gender; 
    } 

    public void setGender(Gender gender) { 
     this.gender = gender; 
    } 

    private Gender gender; 
} 

这个新的模型将包含一个getter和setter为我想改变的值。在阴影对象的构造,我可以投背景的测试活动,然后嘲笑模型的吸能回到我想要的东西:

@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类中,将引用传递回NewPreferenceMobileActivityTest类,并且我们有对该类的引用。

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; 

一个缺点,这是你需要的性别变量设置为默认值

回答

2

您可以使用ShadowExtractor这样的:

GenderPreferenceInteractorShaddow shadowGender = (GenderPreferenceInteractorShaddow) ShadowExtractor.extract(genderPreferenceInteractor); 
+0

嘿史蒂夫,我没有对GenderPreferenceInteractor类的引用,该实例化在片段中完成,并且我无法访问该对象。 – Killesk

+1

如果您无法访问交互器,则必须使用Mockito等库来模拟交互器。例如:https://medium.com/@Miqubel/testing-android-mvp-aa0de6e165e4#.aofbudlpr –