2016-04-25 20 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'。 但是,謝謝你的回答,我想很多開發者也會發現它很有用。 –