[英]Test Android DecimalFormat with Robolectric
Android庫對DecimalFormat類進行了一些改進。 當然,我需要這些加法之一(有效數字表示法@
)。
當我用Robolectric測試時,似乎使用了標准的Java DecimalFormat類,這使我的測試失敗了。
有沒有辦法告訴Robolectric使用Android版本? 還是應該在我的項目中包括DecimalFormat
(從AOSP復制/粘貼類?)?
這是一個簡化的示例:
如果我在具有以下條件的設備上運行該應用程序:
import java.text.DecimalFormat;
import java.util.Locale;
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
DecimalFormat decimalFormat = (DecimalFormat)java.text.NumberFormat.getInstance(Locale.US);
decimalFormat.applyPattern("@@@");
Log.d('SO', decimalFormat.format(0.0567467));
}
}
它顯示:
W /應用程式:0.0567
在單元測試中:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;
import java.text.DecimalFormat;
import java.util.Locale;
import static junit.framework.TestCase.assertEquals;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class NumberFormatTest {
@Test
public void testSignificantDigit() {
DecimalFormat decimalFormat = (DecimalFormat)java.text.NumberFormat.getInstance(Locale.US);
decimalFormat.applyPattern("@@@");
assertEquals("0.0567", decimalFormat.format(0.0567467));
}
}
運行測試將輸出:
junit.framework.ComparisonFailure:
預期值:0.0567
實際的:@@@ 0
如官方的android文檔所述,在Android RunTime(ART)中運行Java代碼時提供的實現與常規JVM中提供的實現不同。
RoboElectric不在常規的Android手機或仿真器上運行測試,而是在JVM上運行。 在您的主機系統上運行的此JVM沒有經過修改的DecimalFormat運行時實現版本。 因此,據我所知,在JVM中運行測試代碼時,Android提供的功能不可用。 為了能夠使用它,請在android手機上運行測試,但是無論如何,您都可以擺脫RoboElectric的支持,而是使用提供的測試工具 。
另一個邏輯問題:為什么要測試Android類? 我猜Google已經針對其中的更改編寫了測試並跟蹤了這些更改,因此您不應使用所使用的系統提供的測試功能 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.