如何在testing过程中调用oncreate之前获取活动引用

如何在onCreate之前获得Activity的引用将被调用。 而它的testing。 我使用ActivityTestRule作为JUnit规则。 这个要求的原因是我想从testing中注入模拟活动。

public class MyActivity extends Activity{ MyComponent myComponent; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); if(myComponent==null){ myComponent ... //initialise dagger component } myComponent.inject(this); ... } public void setComponent(MyComponent comp){ this.myComponent = comp; } } public class MyTest{ @Rule public ActivityTestRule<MyActivity> intentsTestRule = new ActivityTestRule<>(MyActivity.class); MyComponent myFakeComponent; @Before public void setUp() { MyActivity activity = intentsTestRule.getActivity(); activity.setComponent(myFakeComponent); } @Test public void testMethod1(){...} } 

Solutions Collecting From Web of "如何在testing过程中调用oncreate之前获取活动引用"

根据文件,你在这里做的是错误的。

 @Rule public ActivityTestRule<MyActivity> intentsTestRule = new ActivityTestRule<>(MyActivity.class); MyComponent myFakeComponent; @Before public void setUp() { MyActivity activity = intentsTestRule.getActivity(); activity.setComponent(myFakeComponent); } 

因为,

此规则提供了单个活动的functiontesting。 被testing的活动将在用Test注释的每个testing之前以@Before注释的方法之前启动。 testing完成后将终止,方法用After注释完成。 在testing期间,您将能够直接操作您的活动。

然而!

 protected void beforeActivityLaunched () 

重写此方法以执行在创build和启动“活动”之前应运行的任何代码。 此方法在每个testing方法之前调用,包括用@Before注释的任何方法。

因此,如果将“活动”外的MainActivityComponent的初始化移动到可嘲弄的位置,那么在创build主活动之前,您可以一起修补它。

编辑:

另一个可能的解决scheme是按照链接懒惰地启动活动。

 @Rule public ActivityTestRule<NoteDetailActivity> mNoteDetailActivityTestRule = new ActivityTestRule<>(NoteDetailActivity.class, true /* Initial touch mode */, false /* Lazily launch activity */); @Before public void intentWithStubbedNoteId() { // Add a note stub to the fake service api layer. FakeNotesServiceApiImpl.addNotes(NOTE); // Lazily start the Activity from the ActivityTestRule this time to inject the start Intent Intent startIntent = new Intent(); startIntent.putExtra(NoteDetailActivity.EXTRA_NOTE_ID, NOTE.getId()); mNoteDetailActivityTestRule.launchActivity(startIntent); registerIdlingResource(); } 

这段代码是否完整? 我看不到你创build的匕首图。 无论如何,我在我的代码中做的是有一个名为Injector的Static类为我创buildgraphics,也可以将元素注入到对象中。 所以,在我的应用程序类中,我将其称为创build图,其他所有活动只是使用现有的图。

然后,在testing中,您可以创build一个假的testing应用程序类,以不同的方式初始化graphics,或者在创build活动之前重新创build调用Injector方法的graphics。 我不熟悉ActivityTestRule,所以我无法帮助testing的生命周期。

但只要确保在创build活动之前创build一个新图,并让活动使用现有的图。 活动如何访问图表? 嗯,我并不是很喜欢它,但是我们习惯于访问应用程序类(使用显式types转换),并要求它为我们注入依赖关系。 这就是Dagger的例子。

这是我的示例代码:

 public class TestClass { @Rule public ActivityTestRule<T> activityRule = new ActivityTestRule<T>(type) { @Override protected void beforeActivityLaunched() { //TODO inject mocks, setup stubs etc.. } }; } @Before public void before() { activityRule.getActivity(); } @Test public void myTest() { //... } }