Android 使用ActivityInstrumentationTestCase2似乎无法测试ListView内容
我有以下测试代码。我试图测试是否正在从SQLite数据库填充列表Android 使用ActivityInstrumentationTestCase2似乎无法测试ListView内容,android,mockito,android-testing,Android,Mockito,Android Testing,我有以下测试代码。我试图测试是否正在从SQLite数据库填充列表 public class ViewIssuesActivityTest extends BaseActivityTest<ViewIssuesActivity>{ private List<Issue> issues; public ViewIssuesActivityTest() { super(ViewIssuesActivity.class); } public void
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());
}
}
公共类视图IssuseActivityTest扩展了BaseActivityTest{
私人名单问题;
公共视图发布活动测试(){
super(viewsissueactivity.class);
}
public void setUp()引发异常{
super.setUp();
issues=新的ArrayList();
添加(新发行(“试用”、“描述”、“位置”、“图像路径”);
IssueRepository IssueRepository=mock(IssueRepository.class);
doAnswer(新答案){
@凌驾
公共列表应答(invocationMock调用)抛出可丢弃的{
退货问题;
}
}).when(issueRepository).getIssues();
活动。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();
}
}
公共类BaseActivityTest扩展了ActivityInstrumentationTestCase2{
保护性T细胞活性;
public-BaseActivityTest(类activityClass){
超级(活动类);
}
@凌驾
受保护的void setUp()引发异常{
activity=getActivity();
}
}
我的ViewIssues活动如下:
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);
}
}
公共类ViewIssuesActivity扩展了ListActivity{
私人发行保兑发行保兑;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(com.change.kranti.R.layout.issues);
issueRepository=新的issueRepository(getApplicationContext());
列表问题=新建ArrayList();
issues=issueRepository.getIssues();
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,问题);
setListAdapter(适配器);
}
}
问题是我得到错误:预期得到
我认为问题在于onCreate方法在创建issueRepository之前被调用。
我想模拟IssueRepository并测试我的列表是否被填充
我的代码有什么问题,或者有没有更好的方法来测试这个功能
任何帮助都将不胜感激。不清楚您想做什么 不能对同一个类同时运行两个测试。ActivityInstrumentationTestCase2类本质上是被测活动的控制器和包装器,但它只能控制单个活动,并且不能用ActivityInstrumentationTestCase2的多个实例控制同一活动 要设置用于测试驱动开发的应用程序,请尝试使用尽可能多的POJO(普通旧Java对象)。将活动测试限制为可以模拟的内容,例如发送意图或POJO之间的集成
ActivityInstrumentationTestCase2是一个JUnit TestCase子类,但它有局限性。你说得对。问题是在注入mock
issueRepository
之前调用了onCreate
方法。在ActivityInstrumentationTestCase2
的上下文中调用getActivity
时,将调用所有常用的生命周期方法(即onCreate
、onStart
和onResume
)。当您的测试代码调用setIssueRepository
时,已经太晚了,问题已经从存储库中获取
在这种情况下,我知道的最好的解决方案是使用依赖注入,无论是手动还是使用DI框架。但我并不是同时运行两个测试。我有一个与DB对话的IssuerPository,ViewIssueActivity将项目从DB读取到列表。我需要测试这个功能。