Android单元测试 - 代码引用android类时的最佳实践

时间:2013-12-09 23:36:04

标签: android unit-testing junit android-testing

我有一个常规的JUnit测试用例来测试非android方法逻辑。该方法将TextUtils用于TextUtils.isEmpty()。

之类的东西

让我成为AndroidTestCase只是为了引入TextUtils类是没有意义的。有没有更好的方法来测试这个单元测试?比如将android.jar添加到测试项目中还是什么?

与我想要模拟Context对象的另一个测试类似的情况。我不能在不扩展AndroidTestCase的情况下嘲笑它。在这些情况下,我只是尝试测试非Android逻辑并且不希望它在模拟器上运行,但它触及一些android类的最佳实践是什么?

谢谢

2 个答案:

答案 0 :(得分:5)

您可以通过两种方式为Android代码运行测试。首先是仪表化测试选项,您可以通过将adb连接到系统来测试代码。

第二种更实用的方法是JUnit Testing,只测试你的Java类,并且模拟所有其他与Android相关的东西。

使用PowerMockito

在类名上方添加此项,并包含任何其他CUT类名(测试中的类)

@RunWith(PowerMockRunner.class)
@PrepareForTest({TextUtils.class})
public class ContactUtilsTest
{

将此添加到您的@Before

@Before
public void setup(){
PowerMockito.mockStatic(TextUtils.class);
mMyFragmentPresenter=new MyFragmentPresenterImpl();
}

这将使PowerMockito返回TextUtils

中方法的默认值

例如,让我们说你的实现正在检查字符串是否为空,然后在@Test

when(TextUtils.isEmpty(any(CharSequence.class))).thenReturn(true);
//Here i call the method which uses TextUtils and check if it is returning true
assertTrue(MyFragmentPresenterImpl.checkUsingTextUtils("Fragment");

您还必须添加相关的gradle依赖项

testCompile "org.powermock:powermock-module-junit4:1.6.2"
testCompile "org.powermock:powermock-module-junit4-rule:1.6.2"
testCompile "org.powermock:powermock-api-mockito:1.6.2"
testCompile "org.powermock:powermock-classloading-xstream:1.6.2"

答案 1 :(得分:3)

或许看看http://robolectric.org/

它模拟了大部分Android SDK,因此测试可以在纯Java中运行。这意味着它们可以在常规桌面VM中更快地运行。

凭借这种速度,测试驱动的开发成为可能。