初试Robolectric进行单元测试

前言:

最近算是稍微入门了点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前辈能够带带路,感激不尽啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值