我有以下测试代码。我正在尝试测试是否正在从SQLite数据库填充列表。
public class ViewIssuesActivityTest extends BaseActivityTest<ViewIssuesActivity>{
private List<Issue> issues;
public ViewIssuesActivityTest() {
super(ViewIssuesActivity.class);
}
public void setUp() throws Exception {
super.setUp();
issues = new ArrayList<Issue>();
issues.add(new Issue("Trial","Desc","Location","ImagePath"));
IssueRepository issueRepository = mock(IssueRepository.class);
doAnswer(new Answer<Object>() {
@Override
public List<Issue> answer(InvocationOnMock invocation) throws Throwable {
return issues;
}
}).when(issueRepository).getIssues();
activity.setIssueRepository(issueRepository);
}
public void testNumberOfIssuesRecorded() {
ListView listView = (ListView) activity.findViewById(android.R.id.list);
assertEquals(1, listView.getCount());
}
}
我的BaseActivityTest代码是:
public class BaseActivityTest<T extends Activity> extends ActivityInstrumentationTestCase2<T> {
protected T activity;
public BaseActivityTest(Class<T> activityClass) {
super(activityClass);
}
@Override
protected void setUp() throws Exception {
activity = getActivity();
}
}
我的ViewIssuesActivity如下:
public class ViewIssuesActivity extends ListActivity{
private IssueRepository issueRepository;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(com.change.kranti.R.layout.issues);
issueRepository = new IssueRepository(getApplicationContext());
List<Issue> issues = new ArrayList<Issue>();
issues = issueRepository.getIssues();
ArrayAdapter<Issue> adapter = new ArrayAdapter<Issue>(this,
android.R.layout.simple_list_item_1, issues);
setListAdapter(adapter);
}
}
问题是我收到错误:预期&lt; 1&gt;得到&lt; 0&gt;
我认为问题是在创建issueRepository之前调用onCreate方法。 我想模拟IssueRepository并测试我填充的列表。
我的代码有什么问题,或者有更好的方法来测试此功能。
任何帮助将不胜感激。
答案 0 :(得分:1)
你是对的。问题是在注入模拟onCreate
之前调用issueRepository
方法。当您在getActivity
的上下文中调用ActivityInstrumentationTestCase2
时,会调用所有常用生命周期方法(即onCreate
,onStart
和onResume
)。当您的测试代码调用setIssueRepository
时,已经太晚了,问题已从存储库中提取。
在这种情况下,我所知道的最佳解决方案是使用依赖注入,无论是手动还是使用DI框架。
答案 1 :(得分:0)
目前尚不清楚你要做什么。
您不能同时针对同一个类运行两个测试。 ActivityInstrumentationTestCase2类本质上是受测试的Activity的控制器和包装器,但它只能控制单个Activity,并且您无法使用多个ActivityInstrumentationTestCase2实例控制相同的Activity。
要为测试驱动的开发设置应用程序,请尝试尽可能多地使用POJO(Plain Old Java Objects)。将Activity测试限制为诸如发送Intents或可以模拟的POJO之间的集成等内容。
ActivityInstrumentationTestCase2是一个JUnit TestCase子类,但它有局限性。