我正在使用ActivityUnitTestCase来测试Activity的行为。调用活动上的方法时,应显示DialogFragment。 This question给人的印象是,使用此类TestCase无法测试此特定行为。
使用ActivityInstrumentationTestCase2的问题是我无法控制创建Activity时使用的依赖注入。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((App) getApplication()).inject(this);
...
}
对于依赖注入,我使用的是Dagger。 Application子类App
包含对象图的引用,并在调用onCreate
时将引用注入到此Activity中。在ActivityUnitTestCase中,我可以提供一个模拟App,它有自己的对象图,用于注入我可以进行断言的对象。据我所知,这在ActivityInstrumentationTestCase2中是不可能的。
相关测试方法如下:
public void testMyMethod_displaysDialogFragment() {
startActivity(new Intent(), null, null);
currentActivity.myMethod();
getInstrumentation().waitForIdleSync(); // irrelevant
MyDialogFragment fragment = (MyDialogFragment) currentActivity
.getFragmentManager().findFragmentByTag("MyDialogFragment");
assertNotNull("should display the dialog", fragment); // fails
}
我能确定的唯一解决方案是使用工厂或Dagger Provider进行注入和测试。它允许我使用ActivityUnitTestCase,但极大地使app结构复杂化。对于像“单击此按钮时调用此方法”这样简单的行为,我非常希望避免这种情况。
有没有人对解决这些限制有任何想法?