Skip to main content

Junit - Test fails on French or German string assertion

In my previous post about building a regex to check a text without special characters but allow German and French. I met a problem that the unit test works fine on my machine using Eclipse, but it was fail when running on Jenkins' build job.

Here is my test:

@Test
public void shouldAllowFrenchAndGermanCharacters(){
  String source = "ÄäÖöÜüß áÁàÀâÂéÉèÈêÊîÎçÇ"; 
  assertFalse(SpecialCharactersUtils.isExistSpecialCharater(source));
}

Production code:

public static boolean isExistNotAllowedCharacters(String source){  
  Pattern regex = Pattern.compile("^[a-zA-Z_0-9_ÄäÖöÜüß áÁàÀâÂéÉèÈêÊîÎçÇ]*$");  
  Matcher matcher = regex.matcher(source);  
  return !matcher.matches();  
 } 

The result likes the following:
 
Failed tests:
   SpecialCharactersUtilsTest.shouldAllowFrenchAndGermanCharacters:32 null

A guy from stackoverflow.com says:

"This is probably due to the default encoding used for your Java source files. The ö in the string literal in the JUnit source code is probably being converted to something else when the test is compiled. To avoid this, use Unicode escapes (\uxxxx) in the string literals in your JUnit source code"

So, I tried to find what and where exactly  the \uxxxx is. The answer they are Unicode character codes, and they could be easy to find. The following is an example:

https://en.wikipedia.org/wiki/List_of_Unicode_characters

I changed the function to use Unicode characters instead:

public static boolean isExistSpecialCharater(String source){
 Pattern regex = Pattern.compile("^[a-zA-Z_0-9_\u00c4\u00e4\u00d6\u00f6\u00dc\u00fc\u00df\u00e0\u00c0\u00e1\u00c1\u00e2\u00c2\u00e9\u00c9\u00e8\u00c8\u00ea\u00ca\u00ee\u00ce\u00e7\u00c7\u0020\u0027]*$");
 Matcher matcher = regex.matcher(source);
 return !matcher.matches();
  
} 

And, modified the test case also:

@Test
public void shouldAllowFrenchCharacters(){
   String source = "\u00e0\u00c0\u00e1\u00c1\u00e2\u00c2\u00e9\u00c9\u00e8\u00c8\u00ea\u00ca\u00ee\u00ce\u00e7\u00c7\u0020\u0027"; 
   assertFalse(SpecialCharactersUtils.isExistSpecialCharater(source));
}

Yeah, it works. Besides, I have already made it by writing an automation test with Selenium to make sure that it can also work on GUI as my expectation.

References:
[1]. http://stackoverflow.com/questions/4237581/comparing-unicode-characters-in-junit
[2]. http://www.widecodes.com/0zxqPkPkej/junit-fails-on-french-string-assertion.html

Comments

  1. By using Jenkins job, the Unicode character codes should be lower case all characters in Java code. for example: use '\u00e0' instead of '\u00E0'

    ReplyDelete
  2. it just work when You use lower case for all special character. for ex: \u00E0 will not work

    ReplyDelete
  3. You can use this tool to convert from unicode to hex:
    http://www.endmemo.com/unicode/unicodeconverter.php

    ReplyDelete

Post a Comment

Popular posts from this blog

Gzip upload on browsers

Today, I faced a problem that I could not upload my archive file with gzip format on Firefox, even it worked on Chrome. I was using macOS. My application had a setting to whitelist accepted files. I’ve already added "application/gzip" to that list. "It’s strange!", I thought. I finally figured out that my uploaded file's type actually was "application/x-gzip" on Firefox. I also asked my colleagues to check their uploaded files on Window and Ubuntu. Hmm… they were totally different! It was "application/x-compressed" on Window, and was "application/x-compressed-tar" on Ubuntu. In fact, gzip is already standardized by IANA. There is a note in RFC-6713 as below: "Some applications have informally used media types such as application/gzip-compressed, application/gzipped, application/x-gunzip, application/x-gzip, application/x-gzip-compressed, and gzip/document to describe data compressed with gzip. The media types defin...

Java 8 - Persistent data structure

The following is a series of posts about "functional programming in Java" which is the result of my understanding by reading the book " Java 8 in Action: Lambdas, Streams, and Functional-style Programming, by Alan Mycroft and Mario Fusco ". 1. Why functional programming? 2. Functional programming in Java 8 3. Java 8 - Using Functions as Values 4. Java 8 - Persistent data structure Persistent data structure is also known as a simple technique but it's very important. Its other names are functional data structure and immutable data structure. Why is it "persistent"? Their values persist and are isolated from changes happening elsewhere. That's it! This technique is described as below: If you need a data structure to represent the result of a computation, you should make a new one and not mutable an existing data structure. Destructive updates version public static A doSomething(A a){ a.setProp1("new value"); return...

Fulfilling Your Contribution Needs

Human resource management motivation Managing human today is quite different from the industrial age which treats people as just "chickens". Rather than people now are very important to the success of an organization. People are an organization's special resource. They should be encouraged to grow to contribute their effort and creativeness to their beloved working environment because the contribution is one of their most needs in life. Training people: getting rid of the ineffective model and adopting the new one The ineffective model of training people: Hiring new people --> giving them a crash course once --> expecting them working effectively.  That somehow makes sense but you're about to expect a luck because you do not really spend your effort for mentoring them. If they can work effectively, well...lucky you! Otherwise, you will blame that these people are ineffective and you let them go and hire the new ones. What a waste of time! The new effe...

Daily Meetings - Coordinate and Communicate Every Day

Using daily meetings for frequent course corrections. However, you should keep the meeting short because time is burn rate . Though good collaboration doesn't guarantee a project's success, poor collaboration almost always guarantees a project's failure What benefits does the daily meeting bring to you? - Keeps inexperienced developers and experienced ones on-track. - Avoids reinventing the wheel. - Limits  tumbleweed developers ' damage. - Leverages the entire team’s experience to solve problems quickly. - Improves team communication. - Helps every people have a big-picture point of view. Who are tumbleweed developers? We’ve all worked with a few tumbleweed developers. These developers lose direction and drift through their days. They wade through the random code and “improve” it, cleaning up method signatures, polishing algorithms, and reformatting brackets. Tumbleweed developers lack the discipline to finish any task you ask them to do and generally c...