Description
openedon Jan 31, 2023
I am trying to write a parameterized test for a service that uses a resource bundle under the hood, loading the resource bundle with ResourceBundle.getBundle(String, Locale)
.
The test gets several Locale
values in a @CsvSource
annotation:
The documentation does not have an example for a country-based locale so I initially tried with:
@CsvSource({
"en_FR, value1",
"en_GB, value2",
"fr_FR, value3",
"fr_MC, value4",
"it_IT, value5",
...
})
void test(Locale locale, String expected) {
// call service using the resource bundle
// compare result with `expected`
}
All worked fine on Windows (local environment) but failed on Linux (CI).
After some digging, on Windows everything works because it's a case-insensitive file system, so for example the en_FR
value is converted to a en_fr
language-only locale (i.e., without country) and it successfully matches the file ending with en_FR
because of case insensitivity.
Looking at the code, I think the problem is here:
which uses the Locale(String)
constructor. The constructor Javadoc also explains the different behavior based on case sensitivity:
This constructor normalizes the language value to lowercase.
Looking at the test cases:
Probably the second one is invalid. I would have expected that to be:
assertConverts("en_us", Locale.class, Locale.US);
which does not pass with the current implementation.
Steps to reproduce
As the documentation does not cover conversion of locales with country, I am not sure what would be the "right" test case to demonstrate the issue.
Assuming the IETF BCP 47 language tag format would be the right format for input values, this test fails already at the first assertion:
@ParameterizedTest
@ValueSource(strings = { "en-US" })
void test(Locale locale) {
assertEquals("en", locale.getLanguage());
assertEquals("US", locale.getCountry());
assertEquals(Locale.US, locale);
}
Workaround
Currently, I'm using a custom ArgumentConverter
which delegates the conversion to Locale::forLanguageTag
.
Context
- Used versions (Jupiter/Vintage/Platform): 5.8.2
- Build Tool/IDE: Intellij IDEA / Maven
Deliverables
-
DefaultArgumentConverter
properly converts IETF BCP 47 strings - The documentation has an example using the IETF BCP 47 language tag format