使用Java Faker生成随机数

原文地址:rieckpil.de/howto-generate-random-data-in-java-using-java-faker/


  
  原型开发好以后,通常需要一些展示数据。如果没有实际数据,怎样为 Java 程序生成一些有意义的随机数据?

  我用过 UUID 和 ThreadLocalRandom 来生成随机数,但是能力有限,无法提供特定领域的随机数据。于是,我开始寻找更好的解决方案。最后找到了 Faker 这个好东西,幸运的是有 Java 版本:Java Faker。不仅使用方便,而且可以设置多个领域,几秒钟内生成需要的随机数。

  

1. Java Faker 上手

  在 Maven项目中添加 Java Faker 依赖:

1
2
3
4
5
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
<version>0.18</version>
</dependency>

  使用前,创建一个 Faker 对象:

1
Faker faker = new Faker();

  Faker 方法调用时会随机访问底层数据,因此不需要每次都创建一个实例。Java Faker 通过/src/main/resources 中的.yml 获取数据。

  
  使用 Faker 可以访问30多个不同的领域,为几乎每个用例创建随机数。可以使用流式 API 生成随机数:

1
2
3
String firstName = faker.name().firstName();
String appName = faker.app().name();
String foodIngredient = faker.food().ingredient();

  包含的领域有:

  • 金融
  • 视频
  • 书籍
  • 姓名
  • 地址
  • 商务

  此外还包含一些有趣的领域:

  • 尤达
  • 查克·诺里斯
  • 哈利·波特
  • 指环王

  

2. Java Faker 使用示例

  为了演示 Java Faker,这里通过一个 REST API 返回随机数量的 person、book 和 food 对象。虽然示例采用了 Spring Boot 2.1 和 Java 11,但是其他版本也可以正常工作。

  示例应用提供了不同的 Endpoint 获取随机数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RestController
@RequestMapping("/random")
public class RandomDataEndpoint {
@Autowired
private ObjectMapper objectMapper;

@GetMapping("/persons")
public JsonNode getRandomPersons() {
Faker faker = new Faker();
ArrayNode persons = objectMapper.createArrayNode();
for (int i = 0; i < 10; i++) {
persons.add(objectMapper.createObjectNode()
.put("firstName", faker.name().firstName())
.put("lastName", faker.name().lastName())
.put("title", faker.name().title())
.put("suffix", faker.name().suffix())
.put("address", faker.address().streetAddress())
.put("city", faker.address().cityName())
.put("country", faker.address().country()));
}
return persons;
}
}

  

3. 返回本地化随机数据

  随机数据的默认 locale 是 EN。此外,Faker 库还支持返回本地化随机数据。如果指定了 locale 请确保在开发库的支持列表中。可以检查对应的 .yml 文件确认已经有对应的英文版本。

  如果指定的 locale 没有对应的翻译,比如 beers,默认会切换到英文

  
  Faker 构造函数参数默认为 locale:

1
Faker faker = new Faker(new Locale("de"));

  
  上面的代码指定返回的随机数据为德语

1
2
3
4
5
6
7
8
9
10
11
@GetMapping("/foods")
public JsonNode getRandomFoods() {
Faker faker = new Faker(new Locale("de"));
ArrayNode foods = objectMapper.createArrayNode();
for (int i = 0; i < 10; i++) {
foods.add(objectMapper.createObjectNode()
.put("ingredients" , faker.food().ingredient())
.put("spices", faker.food().spice())
.put("measurements", faker.food().measurement()));
}
return foods;}

  
  也可以设为列出的其他 locale:

1
2
3
4
5
6
7
8
9
10
11
12
13
@GetMapping("/books")
public JsonNode getRandomBook() {
Faker faker = new Faker(new Locale("en-US"));
ArrayNode books = objectMapper.createArrayNode();
for (int i = 0; i < 10; i++) {
books.add(objectMapper.createObjectNode()
.put("author", faker.book().author())
.put("genre", faker.book().genre())
.put("publisher", faker.book().publisher())
.put("title", faker.book().title()));
}
return books;
}

  
示例完整源代码可以在 GitHub 上找到:
github.com/rieckpil/blog-tutorials/tree/master/random-data-in-java-using-java-faker

---------------- The End ----------------
0%