注意:我现在使用设置Google recommends在Android Studio中进行JUnit测试。
我试图对一段代码进行单元测试,该代码将货币值存储为double,并以该货币的格式输出字符串。我使用java.text.NumberFormat
来执行此操作:
public NumberFormat viewFormat;
public NumberFormat editFormat;
public CurrencyField(String languageCode, String countryCode) {
viewFormat = NumberFormat.getCurrencyInstance(new Locale(languageCode, countryCode));
viewFormat.setRoundingMode(RoundingMode.FLOOR);
在这里,我得到了我希望格式化显示的值:
public String getDisplayValue()
{
double numberValue = (double) mValue.getValue();
return mField.viewFormat.format(numberValue);
}
当我将代码作为Android应用程序的一部分运行时,数字格式正确。例如,如果我使用以色列谢克尔作为我的货币,我打电话给
Field currencyField = new CurrencyField("he", "ISR");
其中"he"
和"ISR"
分别是希伯来语和以色列的代码。如果数字在内部存储为double 45.12
,则输出为字符串"45.12 ₪"
,这是正确的。但是,当我尝试使用JUnit运行相同的代码时,这里是测试输出的内容:
org.junit.ComparisonFailure:
Expected :45.12 ₪
Actual :¤ 45.12
在我看来,JUnit或Android Studio在测试过程中遗漏了一些Java库。我甚至无法以编程方式获得预期值的谢克尔符号。我尝试使用java.util.Currency
,但这不起作用,然后我尝试了
expectedDisplayValue += ((CurrencyField) field).viewFormat.getCurrency().getSymbol(new Locale("he", "ISR"));
那也没有用。我必须明确定义
private String expectedDisplayValue = "45.12 ₪";
为什么格式化在运行时工作,而不在测试中?
答案 0 :(得分:0)
事实证明我使用的是错误的ISO 3166-1国家/地区代码。我使用alpha 3代码(“ISR”)而不是alpha 2代码(“IL”),它在应用程序中工作但在测试中没有。当我使用希伯来语时,测试仍然给出了错误的符号和格式,但我会问一个单独的问题。与此同时,我将使用其他一些外币进行测试。