2016-04-25 21 views
6

我知道这很奇怪,但这就是我所拥有的。JUnit4 TextUtils.isEmpty()给出的结果不是String.isEmpty()

enter image description here

我正在写一个单元测试来检查我的逻辑,一个Android应用程序。在测试过程中执行,我看它未能在该行:

if (!TextUtils.isEmpty(fromFile))

if声明FROMFILE是之前等于""(空字符串),但不知何故,经过它和休息与没有按另一种逻辑预计空弦。

潜入调试我看到fromFile.isEmpty()返回正确的结果,但TextUtils.isEmpty(fromFile)说它不是空的。

开放的源代码,我看到:

public static boolean isEmpty(@Nullable CharSequence str) { 
    if (str == null || str.length() == 0) 
     return true; 
    else 
     return false; 
} 

和String.java:

public boolean isEmpty() { 
    return value.length == 0; 
} 

我有以下configutation: JDK 1.8.0_77

我想避免整个应用程序中的逻辑支持String.isEmpty()只是为了通过测试,因为我需要在Android API 9之前支持代码,其中String.isEmpty不可用,而al所以TextUtils.isEmpty()做得更多。 任何帮助澄清和建议将有所帮助。

有没有人遇到过它?我应该如何解决它?提前致谢!

回答

7

对于任何人谁都会面对它的未来:

我已经通过的好人帮助想通了这一点,它在gradle这个涉及到Android设备测试配置:

testOptions { 
    unitTests.returnDefaultValues = true 
} 

其中指出我到一个解决方案:摆脱你正在用JUnit(单元测试)测试的buisness逻辑中的android依赖关系。

我简单地用android.text.TextUtils替换android.text.TextUtils我自己的方法是在MyStringUtils.java类,这是相同的。

问题在于,在运行单元测试时,Android方法确实返回了deafult值,并且实际上并未检查fromFile值本身,而是返回存根/默认值。

+0

但是,是一个解决方案?我的意思是,这种情况下你只有TextUtils,但是如果你使用SparsArrays和Android提供的其他一些自定义实用程序实现呢? – karate

+0

纯JUnit测试的想法是,它们必须用于反对POJO(Plain Old Java Object)。 'SparseArrays'不是旧的Java。如果你有它,你可以去http://robolectric.org/,根据google https://developer.android.com/training/testing/fundamentals.html –

1

TextUtils不是JUnit方法。如果您需要TextUtils.isEmpty答案或其他方法来操作,你可以嘲笑它想:

mockStatic(TextUtils.class); 
when(TextUtils.isEmpty(any(CharSequence.class))).thenAnswer(new Answer<Boolean>() { 
     @Override 
     public Boolean answer(InvocationOnMock invocation) throws Throwable { 
      CharSequence str = (CharSequence) invocation.getArguments()[0]; 
      if (str == null || str.length() == 0) 
       return true; 
      else 
       return false; 
     } 
    }); 

不要忘记添加TextUtilsPrepareForTest列表:

@PrepareForTest({TextUtils.class}) 

而且上述方法作品为returnDefaultValues配置:

testOptions { 
    unitTests.returnDefaultValues = true 
} 
+0

完全没错。不幸的是,我们不使用' Powermock'和'mockStatic'不适用。我们转移到了不同​​的架构,我们的Java类是POJO,没有任何android依赖关系。我们也离开了像'Utils.doSomething'这样的静态方法并删除了单例。这使我们能够更好地控制DI和测试覆盖率。 据我所知codecov仍然不支持'PowerMockito'。 但是,谢谢你的回答,我想很多开发者也会发现它很有用。 –