我已经使用robolectric编写了一些测试,现在我想做一些真正的测试类。
我注意到的一件事是我无法测试onCreate,onLocationChanged等事件。
测试事件的标准做法是什么?
如果iI提取事件中的代码并将它们放在方法中,事件会调用方法并且robolectro也可以调用该方法,当然该方法需要公开,对吗?
另外如果我想在我的方法中测试一些通常是私有变量的东西,那么我需要添加一个公共getter,对吧?我可以从robolectric检查这个吗?
有没有更好的方法将数据暴露给robolectric?
答案 0 :(得分: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特定的问题。
请参阅此问题以进行大量讨论: How do I test a class that has private methods, fields or inner classes?
答案 1 :(得分: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的新功能。