Android Studio 中的 JUnit 未正确使用货币格式
JUnit in Android Studio isn't using currency formatting correctly
注意:我现在 recommends 使用设置 Google 在 Android Studio 中进行 JUnit 测试。
我正在尝试对一段代码进行单元测试,该代码将货币值存储为双精度值并输出该货币格式的字符串。我使用 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"
分别是希伯来语和以色列语的代码。如果数字在内部存储为双精度 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 ₪";
为什么格式化在 运行 时起作用,但在测试中不起作用?
原来我用错了 ISO 3166-1 国家代码。我使用的是 alpha 3 代码 ("ISR") 而不是 alpha 2 代码 ("IL"),它在应用程序中有效但在测试中无效。当我使用希伯来语时,测试仍然给我错误的符号和格式,但我会为此提出一个单独的问题。同时,我会用一些其他的外币进行测试。
注意:我现在 recommends 使用设置 Google 在 Android Studio 中进行 JUnit 测试。
我正在尝试对一段代码进行单元测试,该代码将货币值存储为双精度值并输出该货币格式的字符串。我使用 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"
分别是希伯来语和以色列语的代码。如果数字在内部存储为双精度 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 ₪";
为什么格式化在 运行 时起作用,但在测试中不起作用?
原来我用错了 ISO 3166-1 国家代码。我使用的是 alpha 3 代码 ("ISR") 而不是 alpha 2 代码 ("IL"),它在应用程序中有效但在测试中无效。当我使用希伯来语时,测试仍然给我错误的符号和格式,但我会为此提出一个单独的问题。同时,我会用一些其他的外币进行测试。