// use case 10b alternate version
// caches a read comment temporarily
public void testCacheReadComment2() throws Throwable{
    runTestOnUiThread(new Runnable()
    {
        @Override
        public void run(){
            CommentBuilder commentBuilder = new commentBuilder();
            Comment comment = commentBuilder.createTopTestComment();
            //browse button on main screen
            ((Button)activity.findViewById(ca.ualberta.cs.team5geotopics.browseButton)).performClick();
            //the ListView for the custom adapter
            ListView listView = (ListView) activity.findViewById(ca.ualberta.cs.team5geotopics.commentList);
            //the custom adapter on the physical screen
            ArrayAdapter<Comment> adapter = (ArrayAdapter<Comment>) listView.getAdapter();
            adapter.add(comment);
            adapter.notifyDataSetChanged();

            View view = adapter.getView(adapter.getPosition(comment), null, null);
            ViewAsserts.assertOnScreen(listView, view);
            //this is the button to view the Top Level comment in the list
            ViewAsserts.assertOnScreen(view, (Button) view.viewTopLevelComment);
            ((Button)view.viewTopLevelComment).performClick();

            // is there a way I can get references to the objects
            // already instantiated in the test thread?
            CacheController cc = activity.getCacheController();
            assertTrue(cc.getHistory().contains(comment));

        }
    });
}


我们正在使用测试驱动的开发风格,以便为学校编写项目代码。在此测试中,我试图证明用户查看适配器中的列表中的注释后,该注释已缓存在历史记录缓存中。我对某些事情有些困惑,我希望获得一些帮助,因为如果我知道测试用例中没有明显的缺陷,那就太好了。这些是我的问题:

View view = adapter.getView(adapter.getPosition(comment), null, null);


该行是否将返回与数组适配器中存储的注释关联的视图?我的ArrayAdapter将遵循持有人模式,但我不确定这是否是访问需要模仿用户查看评论的按钮的正确方法。

CacheController cc = activity.getCacheController();


我有一个CacheController对象,该对象在我们的主要活动中的onCreate()方法上实例化。现在,我想引用此CacheController来查看历史记录是否正确更新。我只是创建一个新的CacheController并模仿测试方法中CacheController的操作,但是我想测试UIthread上的数据会发生什么。那么,如何在UI线程中引用对象?

最佳答案

View view = adapter.getView(adapter.getPosition(comment), null, null);

  
  该行是否将返回与评论关联的视图
  存储在阵列适配器中?


我认为它应该起作用,但是我不明白您为什么要访问该视图。


  我的ArrayAdapter将遵循持有人的模式,我不确定是否
  这是访问我需要模仿的按钮的正确方法
  用户查看评论。


ArrayAdapter通常用于ListView。您应该只是let ListView handle the click capturing and tell you which element was clicked


  那么,如何在UI线程中引用对象?


您现在有两种解决方案,我现在可以想到:

1)传递CacheController实例,例如:

public class YourClass {

    private final CacheController cacheController;

    public YourClass(final CacheController cacheController) {
        this.cacheController = cacheController;
    }

    public void testCacheReadComment2() throws Throwable {
        CacheController cc = this.cacheController;
    }
}


2)Singleton:将CacheController设为静态并放置一个访问器,例如:

public class CacheController {

    private final CacheController instance = new CacheController();

    public static CacheController getCacheController() {
        return instance;
    }
}


在这两种情况下,您都应该意识到潜在的多线程问题,因为您将产生所有共享相同CacheController实例的新线程。

10-05 22:47