Learn how you can achieve better design using object-oriented and functional approaches. This post includes examples with inheritance and functional interfaces.
Are you also often uninspired when you need to think of useful test data for your unit tests? Is ‘John Doe’ your best test friend? Do not worry, Java Faker comes to the rescue! In this blog, you will learn how to generate your test data. 1. Introduction Making up test data is one of the hardest tasks when writing tests. Often you will see 123 when numbers are being used, or John Doe when a name is needed. But this also means that the test will always run with the same data. This is on the one hand a good thing because your tests needs to be stable, but on the other hand a pitty because you also want to find errors. And this is more likely when random test data is being used. Java Faker is a library based on Ruby’s faker gem and Perl’s Data::Faker library. It will generate fake data for you. There are other Java libraries for that, but in order to see which library gains popularity, a view on the GitHub stars history can be quite useful. As you can see, Java Faker is on the rise. Besides that, it is based on existing fakers in other languages. In this blog, you will learn how to use Java Faker. As usual, all sources being used in this blog are available at GitHub. 2. Add Dependency As a project to experiment with, you will create a basic Spring Boot application. Just navigate to start.spring.io and create a Spring Boot application with Java 17. Java Faker can also be used with plain Java applications of course. The only thing remaining to do, is to add the javafaker dependency to the pom. XML com.github.javafaker javafaker 1.0.2 test 3. First Test Java Faker offers many data fakers which can be used. A complete list can be found here and a demo application with some examples can be found here. In the first example you create, you create a Faker instance and from that moment on, you can choose a faker and generate data. Use the Address faker in order to generate a first name, a last name and a street name. Java @Test void addressFaker() { Faker faker = new Faker(); String firstName = faker.address().firstName(); String lastName = faker.address().lastName(); String streetName = faker.address().streetName(); System.out.println("First name: " + firstName); System.out.println("Last name: " + lastName); System.out.println("Street name: " + streetName); } The output is for example the following, but this will change on each run. Shell First name: Mika Last name: Terry Street name: Wisoky Walk 4. Locale Faker In the previous example, you noticed that English names are generated. But what if you want more locale specific names? That is also possible, but note that not every faker is available in every language. The list for your locale can be found here. Since I am interested in the Dutch locale, the previous example can be rewritten als follows (note that the address faker is available in the NL locale). The only difference is that you need to provide the locale when instantiating the Faker. Java @Test void addressNlFaker() { Faker faker = new Faker(new Locale("nl-NL")); String firstName = faker.address().firstName(); String lastName = faker.address().lastName(); String streetName = faker.address().streetName(); System.out.println("First name: " + firstName); System.out.println("Last name: " + lastName); System.out.println("Street name: " + streetName); } This returns the following output, which corresponds to Dutch names. Shell First name: Irmen Last name: Vaassen Street name: Severensweg 5. Random Strings With FakeValuesService With the FakeValuesService, you can generate several strings containing random data. In the next sections, some of the features are shown. 5.1 Random Strings With Numerify With numerify, you can generate a string containing random numbers. First, you need to create a FakeValuesService instance containing a locale and a RandomService. The method numerify will return a string where the hashes (#) are replaced with numbers. For every hash, a number is replaced. Java @Test void fakeValuesServiceNumerify() { FakeValuesService fakeValuesService = new FakeValuesService(new Locale("nl-NL"), new RandomService()); String randomNumber = fakeValuesService.numerify("number##"); System.out.println("Random number is: " + randomNumber); } The output is for example: Shell Random number is: number37 5.2 Random Strings With Letterify Similar as with numerify, letterify will allow you to replace characters in a string by means of a question mark. Java @Test void fakeValuesServiceLetterify() { FakeValuesService fakeValuesService = new FakeValuesService(new Locale("nl-NL"), new RandomService()); String randomLetters = fakeValuesService.letterify("somestring??"); System.out.println("Random letters are: " + randomLetters); } The output is for example: Shell Random letters are: somestringha 5.3 Random Strings With Bothify A combination of numerify and letterify can be achieved with bothify. With bothify, you can combine random numbers and characters. Java @Test void fakeValuesServiceBothify() { FakeValuesService fakeValuesService = new FakeValuesService(new Locale("nl-NL"), new RandomService()); String randomNumbersLetters = fakeValuesService.bothify("some string with numbers ## and letters ??"); System.out.println("Random numbers and letters are: " + randomNumbersLetters); } The output is for example: Shell Random numbers and letters are: some string with numbers 10 and letters ll 5.4 Random Strings With Regexify When all of the above is not enough, you can also generate strings based on a regular expression with regexify. The next regular expression will choose one or more characters of the list a, b, or c, followed by any whitespace character and a digit. Java @Test void fakeValuesServiceRegexify() { FakeValuesService fakeValuesService = new FakeValuesService(new Locale("nl-NL"), new RandomService()); String randomBasedRegex = fakeValuesService.regexify("[abc]+\\s\\d"); System.out.println("Random string based on a pattern: " + randomBasedRegex); } The output is for example the following. Note that it generates ‘any whitespace character’ which in this case is an end of line character. Shell Random string based on a pattern: ab 9 6. Conclusion Java Faker is an easy to use data faker generation library. It relieves you from the burden of making up test data for your tests. Moreover, it will generate other data on each run which might reveal bugs in your application. The documentation of the library could have been better, but on the other hand, the library is also easy to use, so it should not be a major problem after all.
Learn about a scenario where, at first glance, I needed an active-active Kafka cluster with bi-directional replication. What happened as I dove deeper?
Documentation is crucial to development processes and brings many benefits to development delivery. Let's look at some recommendations and tools for Java-based projects.
I admit that I have (a few? or not so few) bad habits: one of them is that usually, I find a way to do things, and if that works, I stick with it. I know that there are other ways to do things, but hey, why bother? and sometimes a good friend asks an excellent question (are there any bad questions?), and this lets me review the way I’m doing things. and here is such a thing: exporting and importing projects in eclipse. Archive Files With Drag & Drop Here is how I usually move or copy a project to another machine: Find the project place on my hard disk. an easy way is to select the project folder and use the context menu with show in windows explorer Zip that projects into an archive file Delete from that archive file any derived resources (see dissection of mcu10 projects ), as well as remove all the version control information. Copy the archive file into the destination workspace and unzip it there Then drag&drop that folder into eclipse: this will import that project into the workspace. Instead of the folder I simply can drag&drop as well the .project file note: best if i drag&drop the project into the ‘codewarrior projects’ view. this will not work if i drop it into the processor expert ‘project panel’ view. well, that works, and I really get used to that process. so why bother? because there is actually a better way: to export and import. The Export and Import Way 1. Select one or more project and use the ‘export’ context menu or file > export. Here select general > archive file: export project as archive file 2. In the ext dialog, you can deselect files and folder. additionally, you need to specify the archive file. You could use filter types (e.g. to include *.c and *.h). I really wish that this dialog would consider the ‘derived’ flags for files and folder, so I could deselect them easier. archive file settings 3. In the destination workspace, use the menu file > import : import dialog to import a project and here is the stumbling point: Do not (!) select ‘archive file’, but ‘ existing projects into workspace ‘. I have exported it as archive file, but importing an archive file is importing an archive file inside a project , not (!) as a project . This is a usability quirk in eclipse. 4. In the next dialog, you can choose the archive file and make adjustments which project you want to import. Note that it will automatically copy the projects into my workspace. import archive projects 5. Click finish, and the projects get imported. Summary I'm using combinations of both ways: the archive file produced by the export is not different from an archive file I create with my winzip archive utility (or any other tool like this one). for both export ways, I need to manually remove what I do not want in the archive file. I wish there would be better support for this. but for importing projects the import functionality is really good, as it avoids the copy/extract/drag&drop way: I can go through two dialogs, and that’s it. happy export-import ps: thanks to mark ruthenbeck having me considering more the export/import way!