8

我已经使用 robolectric 编写了一些测试,现在我想做一些真正的测试类。

我注意到的一件事是我无法测试 onCreate、onLocationChanged 等事件。

测试事件的标准做法是什么?

我应该提取事件内部的代码并将它们放在一个方法中,事件将调用该方法,robolectro 也可以调用该方法,当然该方法需要是公共的,对吗?

另外,如果我想在我的方法中测试通常是私有变量的东西,那么我需要添加一个公共 getter,对吗?我可以从 robolectric 检查这个吗?

有没有更好的方法向 robolectric 公开数据?

4

2 回答 2

7

在测试 onCreate 时,我让 robolectric 调用 onCreate,然后在 onCreate 之后测试活动是否处于正确状态。这是一个例子:

@RunWith(RoboTestRunner.class)
public class DashboardActivityTest {

    private DashboardActivity activity;

    @Before
    public void setUp() throws Exception {
        activity = new DashboardActivity();
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void testDashboardHasButtons() {
        activity.onCreate(null);
        Button btn1= (Button) activity.findViewById(R.id.btn1);
        assertNotNull(btn1);
        Button btn2= (Button) activity.findViewById(R.id.btn2);
        assertNotNull(btn2);
    }
}

测试私有方法通常表明您的设计可以改进,而不是 Robolectric 特定的问题。

请参阅此问题进行大量讨论: 如何测试具有私有方法、字段或内部类的类?

于 2012-08-16T15:42:16.217 回答
6

从 Robolectric v2 开始,这不是现在开始活动的正确方式:

MyActivity testActivity = new MyActivity();
testActivity.onCreate(null);

现在正确的方法是使用它:

MyActivity testActivity = Robolectric.buildActivity(MyActivity.class).create().get();

这将在调用 onCreate 后为您提供一个活动实例。
如果要测试onStart、onResume、onPause等,方法一样,只是方法多了。

MyActivity testActivity = Robolectric.buildActivity(MyActivity.class).create().start().resume().pause().stop().destroy().get();  

(添加或删除上述代码行中的方法以测试您想要的活动的确切实例)

只是想澄清一下 Robolectric 真正的新特性。

于 2013-06-17T15:51:42.480 回答