前言:
最近算是稍微入门了点android,于是打算自己找点小项目练练手,第一个小项目是做一个计算器,实现功能较简单,但也花费了很多时间,主要是AS更新的问题吧。下面说一下我踩得各种的坑。
首先是Robolectric的环境配置。
在build.gradle(Module:app)内添加
testCompile "org.robolectric:robolectric:3.3.2"
然后在Test内添加测试代码
@RunWith(RobolectricTestRunner.class)
@Config(constants =BuildConfig.class)
public class SandwichTest {
\\add your test code
}
若上述代码不行,则更改为
@RunWith(RobolectricTestRunner.class)
@Config(constants =BuildConfig.class,sdk=21)
好像Robolectric不能支持Sdk很高的版本。
注意哦,这里的代码要加在Test内而不是AndroidTest内,若加在AndroidTest内,会导致不能导入Robolectric包和各种报错,我就是在这踩
了好多坑啊。。
后面搜了一下,发现并不应该这样分,应该分成Android Unit Test 和Android Instrument Test,萌新玩家真的很无奈。下面是关于这两者的区别
Android Unit Test: 脱离emulator和device独立运行在jvm的测试方式。如果想mock更多的Android元件则必须需要Robolectric框架支持,但是测试用例的行为都是运行在Robolectric所建立的仿真Android运行环境中,例如mock packageManager,camera支持的返回信息。
Android Instrument Test: 它是运行在emulator和device上的测试方式,测试用例中所有的行为都是经过android framework验证的,主要的第三方框架支持为Espresso和Robotium。
环境到这算是配置完了,第一次写博客思路可能有点乱,只是想把踩的坑全部说出来以便帮助那些和我一样的萌新。
接下来是测试代码
我做的测试代码和网上流传的类似,大致就是两个Activity之间的跳转。但是当我好不容易配置完环境,输入网上教程的代码进行测试后,讲道理应该测试Success的,但是却Failed了。
还是贴一下代码吧
MainActivity:
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.textView1);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
}
MainActivityTest:
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class,sdk=21)
public class MainActivityTest {
@Test
public void testMainActivity() {
MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class);
mainActivity.findViewById(R.id.textView1).performClick();
Intent expectedIntent = new Intent(mainActivity, SecondActivity.class);
ShadowActivity shadowActivity = Shadows.shadowOf(mainActivity);
Intent actualIntent = shadowActivity.getNextStartedActivity();
Assert.assertEquals(expectedIntent, actualIntent);
}
}
你们可以自己试一下这个代码,然后就发现报错了,报错点很神奇,你们自己去实践吧!
作为萌新当然找不出问题所在,于是到StackOverflow上提了个问题才明白。我们需要把
Assert.assertEquals(expectedIntent, actualIntent);
改为
Assert.assertTrue(actualIntent.filterEquals(expectedIntent));
原因大家直接去这里看一下吧,我也是似懂非懂的样子还不能讲出实质。
最后,我们总算能成功完成测试了。
End
这里仅仅只是学会了如何用Robolectric完成最简单的测试,接下来就要在计算器里完成继承Robolectric添加单元测试功能。加油。
End‘End
贴上小项目的链接吧。也算是学习之路吧。。
如果有Android前辈能够带带路,感激不尽啊!