{"id":158,"date":"2023-12-23T08:17:03","date_gmt":"2023-12-23T08:17:03","guid":{"rendered":"https:\/\/ranjeshviswa.com\/?p=158"},"modified":"2023-12-23T08:17:03","modified_gmt":"2023-12-23T08:17:03","slug":"quarkus-for-spring-boot-developers","status":"publish","type":"post","link":"https:\/\/ranjeshviswa.com\/?p=158","title":{"rendered":"Quarkus for Spring Boot Developers"},"content":{"rendered":"<h2 id=\"f057\" class=\"pw-subtitle-paragraph go fq fr be b gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd cp dw\" data-selectable-paragraph=\"\">Quarkus Overview<\/h2>\n<p id=\"484a\" class=\"pw-post-body-paragraph ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn fk bj\" data-selectable-paragraph=\"\">Quarkus is a full-stack, Kubernetes-native\u00a0<a class=\"af mo\" href=\"https:\/\/www.redhat.com\/en\/topics\/cloud-native-apps\/what-is-a-Java-framework\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\">Java framework<\/a>\u00a0made for Java virtual machines (JVMs) and native compilation, optimising Java specifically for containers and enabling it to become an effective platform for\u00a0<a class=\"af mo\" href=\"https:\/\/www.redhat.com\/en\/topics\/cloud-native-apps\/what-is-serverless\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\">serverless<\/a>,\u00a0<a class=\"af mo\" href=\"https:\/\/www.redhat.com\/en\/topics\/cloud\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\">cloud<\/a>, and\u00a0<a class=\"af mo\" href=\"https:\/\/www.redhat.com\/en\/topics\/containers\/what-is-kubernetes\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\">Kubernetes<\/a>\u00a0environments. Quarkus is designed to work with popular Java standards, frameworks, and libraries like Eclipse MicroProfile and Spring, as well as Apache Kafka, RESTEasy (JAX-RS), Hibernate ORM (JPA), Spring, Infinispan, Camel, and many more.<\/p>\n<h2 id=\"f5f7\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Container-first<\/h2>\n<p id=\"9902\" class=\"pw-post-body-paragraph ls lt fr lu b gp nk lw lx gs nl lz ma mb nm md me mf nn mh mi mj no ml mm mn fk bj\" data-selectable-paragraph=\"\">Whether an application is hosted on a public cloud or in an internally hosted Kubernetes cluster, characteristics like fast startup and low memory consumption are important to keeping overall host costs down.<\/p>\n<p id=\"eece\" class=\"pw-post-body-paragraph ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn fk bj\" data-selectable-paragraph=\"\">Quarkus was built around a\u00a0<a class=\"af mo\" href=\"https:\/\/quarkus.io\/vision\/container-first\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\">container-first<\/a>\u00a0philosophy, meaning it\u2019s optimised for lower memory usage and faster startup times in the following ways:<\/p>\n<ul class=\"\">\n<li id=\"3c45\" class=\"ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">First-class support for Graal\/SubstrateVM<\/li>\n<li id=\"329a\" class=\"ls lt fr lu b gp ns lw lx gs nt lz ma mb nu md me mf nv mh mi mj nw ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">Build-time metadata processing<\/li>\n<li id=\"3b55\" class=\"ls lt fr lu b gp ns lw lx gs nt lz ma mb nu md me mf nv mh mi mj nw ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">Reduction in reflection usage<\/li>\n<li id=\"7e55\" class=\"ls lt fr lu b gp ns lw lx gs nt lz ma mb nu md me mf nv mh mi mj nw ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">Native image preboot<\/li>\n<\/ul>\n<p id=\"48d8\" class=\"pw-post-body-paragraph ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn fk bj\" data-selectable-paragraph=\"\">So Quarkus builds applications to consume 1\/10th the memory when compared to traditional Java, and has a faster startup time (as much as 300 times faster), both of which greatly reduce the cost of cloud resources.<\/p>\n<p id=\"6798\" class=\"pw-post-body-paragraph ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn fk bj\" data-selectable-paragraph=\"\">Quarkus is an effective solution for running Java in this new world of serverless architecture, microservices, containers, Kubernetes, function-as-a-service (FaaS), and cloud because it was created with all these things in mind.<\/p>\n<h2 id=\"bc28\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Introduction<\/h2>\n<p id=\"9902\" class=\"pw-post-body-paragraph ls lt fr lu b gp nk lw lx gs nl lz ma mb nm md me mf nn mh mi mj no ml mm mn fk bj\" data-selectable-paragraph=\"\">Whether an application is hosted on a public cloud or in an internally hosted Kubernetes cluster, characteristics like fast startup and low memory consumption are important to keeping overall host costs down.<\/p>\n<p id=\"eece\" class=\"pw-post-body-paragraph ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn fk bj\" data-selectable-paragraph=\"\">Quarkus was built around a\u00a0<a class=\"af mo\" href=\"https:\/\/quarkus.io\/vision\/container-first\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\">container-first<\/a>\u00a0philosophy, meaning it\u2019s optimised for lower memory usage and faster startup times in the following ways:<\/p>\n<ul class=\"\">\n<li id=\"3c45\" class=\"ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">First-class support for Graal\/SubstrateVM<\/li>\n<li id=\"329a\" class=\"ls lt fr lu b gp ns lw lx gs nt lz ma mb nu md me mf nv mh mi mj nw ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">Build-time metadata processing<\/li>\n<li id=\"3b55\" class=\"ls lt fr lu b gp ns lw lx gs nt lz ma mb nu md me mf nv mh mi mj nw ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">Reduction in reflection usage<\/li>\n<li id=\"7e55\" class=\"ls lt fr lu b gp ns lw lx gs nt lz ma mb nu md me mf nv mh mi mj nw ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">Native image preboot<\/li>\n<\/ul>\n<p id=\"48d8\" class=\"pw-post-body-paragraph ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn fk bj\" data-selectable-paragraph=\"\">So Quarkus builds applications to consume 1\/10th the memory when compared to traditional Java, and has a faster startup time (as much as 300 times faster), both of which greatly reduce the cost of cloud resources.<\/p>\n<p id=\"6798\" class=\"pw-post-body-paragraph ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn fk bj\" data-selectable-paragraph=\"\">Quarkus is an effective solution for running Java in this new world of serverless architecture, microservices, containers, Kubernetes, function-as-a-service (FaaS), and cloud because it was created with all these things in mind.<\/p>\n<h2 id=\"9251\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Requirements<\/h2>\n<ul class=\"\">\n<li id=\"1c5c\" class=\"ls lt fr lu b gp nk lw lx gs nl lz ma mb nm md me mf nn mh mi mj no ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">JDK 11+<\/li>\n<li id=\"c51f\" class=\"ls lt fr lu b gp ns lw lx gs nt lz ma mb nu md me mf nv mh mi mj nw ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">GraalVM<\/li>\n<li id=\"e767\" class=\"ls lt fr lu b gp ns lw lx gs nt lz ma mb nu md me mf nv mh mi mj nw ml mm mn np nq nr bj\" data-selectable-paragraph=\"\">Docker<\/li>\n<\/ul>\n<h2 id=\"5d1f\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Maven dependencies<\/h2>\n<blockquote>\n<pre><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\"> &lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.quarkus<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>quarkus-resteasy-reactive<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\"> &lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n\r\n<span class=\"hljs-tag\"> &lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.quarkus<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>quarkus-resteasy-reactive-jackson<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\"> &lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n\r\n<span class=\"hljs-tag\"> &lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.quarkus<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>quarkus-junit5<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">scope<\/span>&gt;<\/span>test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">scope<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\"> &lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n\r\n<span class=\"hljs-tag\"> &lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.rest-assured<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>rest-assured<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">scope<\/span>&gt;<\/span>test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">scope<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\"> &lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n\r\n<span class=\"hljs-tag\"> &lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.quarkus<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>quarkus-junit5-mockito<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">scope<\/span>&gt;<\/span>test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">scope<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\"> &lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n\r\n<span class=\"hljs-tag\"> &lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.quarkus<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>quarkus-jdbc-postgresql<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\"> &lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n\r\n<span class=\"hljs-tag\"> &lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.quarkus<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>quarkus-spring-data-jpa<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\"> &lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n\r\n<span class=\"hljs-tag\"> &lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.modelmapper<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>modelmapper<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">  &lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>3.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\"> &lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span><\/pre>\n<\/blockquote>\n<h2 id=\"0e68\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Controller Layer<\/h2>\n<pre><span class=\"hljs-meta\">@Path(\"\/api\/users\")<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">UserController<\/span> {\r\n\r\n<span class=\"hljs-meta\"> @Inject<\/span>\r\n UserService userService;\r\n\r\n<span class=\"hljs-meta\"> @GET<\/span>\r\n<span class=\"hljs-meta\"> @Path(\"\/{id}\")<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> User <span class=\"hljs-title.function\">getUser<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@PathParam(\"id\")<\/span> Long id)<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> userService.getUserById(id);\r\n }\r\n\r\n<span class=\"hljs-meta\"> @GET<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> List&lt;User&gt; <span class=\"hljs-title.function\">getAllUsers<\/span><span class=\"hljs-params\">()<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> userService.getUsers();\r\n }\r\n\r\n<span class=\"hljs-meta\"> @POST<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> User <span class=\"hljs-title.function\">createUser<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">final<\/span> User user)<\/span> {\r\n<span class=\"hljs-type\">  User<\/span> <span class=\"hljs-variable\">createdUser<\/span> <span class=\"hljs-operator\">=<\/span> userService.createUser(user);\r\n<span class=\"hljs-keyword\">  return<\/span> createdUser;\r\n }\r\n\r\n<span class=\"hljs-meta\"> @PUT<\/span>\r\n<span class=\"hljs-meta\"> @Path(\"\/{id}\")<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> User <span class=\"hljs-title.function\">updateUser<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@RestPath<\/span> Long id, User user)<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> userService.updateUser(id, user);\r\n }\r\n\r\n<span class=\"hljs-meta\"> @PATCH<\/span>\r\n<span class=\"hljs-meta\"> @Path(\"\/{id}\")<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> User <span class=\"hljs-title.function\">patchUpdateUser<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@RestPath<\/span> Long id, User user)<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> userService.patchUpdateUser(id, user);\r\n }\r\n\r\n<span class=\"hljs-meta\"> @DELETE<\/span>\r\n<span class=\"hljs-meta\"> @Path(\"\/{id}\")<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">deleteUser<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@RestPath<\/span> Long id)<\/span> {\r\n  userService.deleteUser(id);\r\n }\r\n}<\/pre>\n<h2 data-selectable-paragraph=\"\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-178\" src=\"https:\/\/ranjeshviswa.com\/wp-content\/uploads\/2023\/12\/ControllerImage.png\" alt=\"\" width=\"1268\" height=\"938\" \/><\/h2>\n<h2 id=\"d49f\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Service Layer<\/h2>\n<pre><span class=\"hljs-meta\">@ApplicationScoped<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">UserServiceImpl<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title.class\">UserService<\/span> {\r\n\r\n<span class=\"hljs-meta\"> @Inject<\/span>\r\n<span class=\"hljs-keyword\"> private<\/span> UsersRepository usersRepository;\r\n\r\n<span class=\"hljs-meta\"> @Override<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> User <span class=\"hljs-title.function\">getUserById<\/span><span class=\"hljs-params\">(Long id)<\/span> {\r\n  Optional&lt;User&gt; maybeUser = usersRepository.findById(id);\r\n<span class=\"hljs-keyword\">  return<\/span> maybeUser.orElseThrow(() -&gt; <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">RuntimeException<\/span>(<span class=\"hljs-string\">\"User not found\"<\/span>));\r\n }\r\n\r\n<span class=\"hljs-meta\"> @Override<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> User <span class=\"hljs-title.function\">createUser<\/span><span class=\"hljs-params\">(User user)<\/span> {\r\n  usersRepository.findByEmail(user.getEmail())\r\n  .ifPresent(p -&gt; {\r\n<span class=\"hljs-keyword\">   throw<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">RuntimeException<\/span>(<span class=\"hljs-string\">\"User with email \"<\/span> + p.getEmail() + <span class=\"hljs-string\">\" already exists \"<\/span>);\r\n  });\r\n<span class=\"hljs-keyword\">  return<\/span> usersRepository.save(user);\r\n }\r\n\r\n<span class=\"hljs-meta\"> @Override<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> User <span class=\"hljs-title.function\">updateUser<\/span><span class=\"hljs-params\">(Long id, User user)<\/span> {\r\n<span class=\"hljs-type\">  User<\/span> <span class=\"hljs-variable\">userFound<\/span> <span class=\"hljs-operator\">=<\/span> usersRepository.findById(id).orElseThrow(() -&gt; <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">RuntimeException<\/span>(<span class=\"hljs-string\">\"User not found\"<\/span>));\r\n  userFound.setFirstName(user.getFirstName());\r\n  userFound.setLastName(user.getLastName());\r\n  userFound.setEmail(user.getEmail());\r\n  userFound.setFirstLineOfAddress(user.getFirstLineOfAddress());\r\n  userFound.setSecondLineOfAddress(user.getSecondLineOfAddress());\r\n  userFound.setTown(user.getTown());\r\n  userFound.setPostCode(user.getPostCode());\r\n<span class=\"hljs-keyword\">  return<\/span> usersRepository.save(userFound);\r\n }\r\n\r\n<span class=\"hljs-meta\"> @Override<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> User <span class=\"hljs-title.function\">patchUpdateUser<\/span><span class=\"hljs-params\">(Long id, User user)<\/span> {\r\n<span class=\"hljs-type\">  User<\/span> <span class=\"hljs-variable\">userFound<\/span> <span class=\"hljs-operator\">=<\/span> usersRepository.findById(id).orElseThrow(() -&gt; <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">RuntimeException<\/span>(<span class=\"hljs-string\">\"User not found\"<\/span>));\r\n<span class=\"hljs-type\">  ModelMapper<\/span> <span class=\"hljs-variable\">modelMapper<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">ModelMapper<\/span>();\r\n<span class=\"hljs-comment\">  \/\/copy only non null values<\/span>\r\n  modelMapper.getConfiguration().setSkipNullEnabled(<span class=\"hljs-literal\">true<\/span>).setMatchingStrategy(MatchingStrategies.STRICT);\r\n  modelMapper.map(user, userFound);\r\n<span class=\"hljs-keyword\">  return<\/span> usersRepository.save(userFound);\r\n }\r\n\r\n<span class=\"hljs-meta\"> @Override<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">deleteUser<\/span><span class=\"hljs-params\">(Long id)<\/span> {\r\n  usersRepository.deleteById(id);\r\n }\r\n\r\n<span class=\"hljs-meta\"> @Override<\/span>\r\n<span class=\"hljs-keyword\"> public<\/span> List&lt;User&gt; <span class=\"hljs-title.function\">getUsers<\/span><span class=\"hljs-params\">()<\/span> {\r\n  Iterable&lt;User&gt; userIterable = usersRepository.findAll();\r\n<span class=\"hljs-keyword\">  return<\/span> StreamSupport.stream(userIterable.spliterator(), <span class=\"hljs-literal\">false<\/span>)\r\n  .collect(Collectors.toList());\r\n }\r\n}<\/pre>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-181\" src=\"https:\/\/ranjeshviswa.com\/wp-content\/uploads\/2023\/12\/ServiceImage.png\" alt=\"\" width=\"1268\" height=\"254\" \/><\/p>\n<h2 id=\"4c28\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Repository Layer<\/h2>\n<p id=\"61f8\" class=\"pw-post-body-paragraph ls lt fr lu b gp nk lw lx gs nl lz ma mb nm md me mf nn mh mi mj no ml mm mn fk bj\" data-selectable-paragraph=\"\">Entity<\/p>\n<p class=\"pw-post-body-paragraph ls lt fr lu b gp nk lw lx gs nl lz ma mb nm md me mf nn mh mi mj no ml mm mn fk bj\" data-selectable-paragraph=\"\">Entity\/Persistence annotation name remain same as used in spring, but belongs to jakarta package<\/p>\n<pre><span class=\"hljs-meta\">@Entity(name = \"users\")<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">User<\/span> {\r\n<span class=\"hljs-meta\"> @Id<\/span>\r\n<span class=\"hljs-meta\"> @GeneratedValue<\/span>\r\n<span class=\"hljs-keyword\"> private<\/span> Long id;\r\n\r\n<span class=\"hljs-meta\"> @Column(nullable = false, length = 50)<\/span>\r\n<span class=\"hljs-keyword\"> private<\/span> String firstName;\r\n\r\n<span class=\"hljs-meta\"> @Column(nullable = false, length = 50)<\/span>\r\n<span class=\"hljs-keyword\"> private<\/span> String lastName;\r\n\r\n<span class=\"hljs-meta\"> @Column(nullable = false, length = 120)<\/span>\r\n<span class=\"hljs-keyword\"> private<\/span> String email;\r\n\r\n<span class=\"hljs-meta\"> @Column(nullable = false, length = 50)<\/span>\r\n<span class=\"hljs-keyword\"> private<\/span> String firstLineOfAddress;\r\n\r\n<span class=\"hljs-meta\"> @Column(length = 50)<\/span>\r\n<span class=\"hljs-keyword\"> private<\/span> String secondLineOfAddress;\r\n\r\n<span class=\"hljs-meta\"> @Column(nullable = false, length = 50)<\/span>\r\n<span class=\"hljs-keyword\"> private<\/span> String town;\r\n\r\n<span class=\"hljs-meta\"> @Column(nullable = false, length = 10)<\/span>\r\n<span class=\"hljs-keyword\"> private<\/span> String postCode;\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> Long <span class=\"hljs-title.function\">getId<\/span><span class=\"hljs-params\">()<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> id;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setId<\/span><span class=\"hljs-params\">(Long id)<\/span> {\r\n<span class=\"hljs-built_in\">  this<\/span>.id = id;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> String <span class=\"hljs-title.function\">getFirstName<\/span><span class=\"hljs-params\">()<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> firstName;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setFirstName<\/span><span class=\"hljs-params\">(String firstName)<\/span> {\r\n<span class=\"hljs-built_in\">  this<\/span>.firstName = firstName;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> String <span class=\"hljs-title.function\">getLastName<\/span><span class=\"hljs-params\">()<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> lastName;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setLastName<\/span><span class=\"hljs-params\">(String lastName)<\/span> {\r\n<span class=\"hljs-built_in\">  this<\/span>.lastName = lastName;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> String <span class=\"hljs-title.function\">getEmail<\/span><span class=\"hljs-params\">()<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> email;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setEmail<\/span><span class=\"hljs-params\">(String email)<\/span> {\r\n<span class=\"hljs-built_in\">  this<\/span>.email = email;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> String <span class=\"hljs-title.function\">getPostCode<\/span><span class=\"hljs-params\">()<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> postCode;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setPostCode<\/span><span class=\"hljs-params\">(String postCode)<\/span> {\r\n<span class=\"hljs-built_in\">  this<\/span>.postCode = postCode;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> String <span class=\"hljs-title.function\">getFirstLineOfAddress<\/span><span class=\"hljs-params\">()<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> firstLineOfAddress;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setFirstLineOfAddress<\/span><span class=\"hljs-params\">(String firstLineOfAddress)<\/span> {\r\n<span class=\"hljs-built_in\">  this<\/span>.firstLineOfAddress = firstLineOfAddress;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> String <span class=\"hljs-title.function\">getTown<\/span><span class=\"hljs-params\">()<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> town;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setTown<\/span><span class=\"hljs-params\">(String town)<\/span> {\r\n<span class=\"hljs-built_in\">  this<\/span>.town = town;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> String <span class=\"hljs-title.function\">getSecondLineOfAddress<\/span><span class=\"hljs-params\">()<\/span> {\r\n<span class=\"hljs-keyword\">  return<\/span> secondLineOfAddress;\r\n }\r\n\r\n<span class=\"hljs-keyword\"> public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setSecondLineOfAddress<\/span><span class=\"hljs-params\">(String secondLineOfAddress)<\/span> {\r\n<span class=\"hljs-built_in\">  this<\/span>.secondLineOfAddress = secondLineOfAddress;\r\n }\r\n}<\/pre>\n<p id=\"6862\" class=\"pw-post-body-paragraph ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn fk bj\" data-selectable-paragraph=\"\">Repository Interface<\/p>\n<p id=\"353b\" class=\"pw-post-body-paragraph ls lt fr lu b gp lv lw lx gs ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn fk bj\" data-selectable-paragraph=\"\">Repository interface used is same as in spring<\/p>\n<pre class=\"nx ny nz oa ob oc od oe bo of ba bj\"><span id=\"45f1\" class=\"og mq fr od b bf oh oi l oj ok\" data-selectable-paragraph=\"\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title.class\">UsersRepository<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title.class\">CrudRepository<\/span>&lt;User, Long&gt; {\r\n    Optional&lt;User&gt; <span class=\"hljs-title.function\">findByEmail<\/span><span class=\"hljs-params\">(String email)<\/span>;\r\n}<\/span><\/pre>\n<h2 id=\"acbc\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Controller Layer Tests<\/h2>\n<pre class=\"nx ny nz oa ob oc od oe bo of ba bj\"><span id=\"36e7\" class=\"og mq fr od b bf oh oi l oj ok\" data-selectable-paragraph=\"\"><span class=\"hljs-meta\">@QuarkusTest<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">UserControllerTest<\/span> {\r\n\r\n    <span class=\"hljs-meta\">@InjectMock<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> UserService userService;\r\n\r\n    <span class=\"hljs-keyword\">private<\/span> User user;\r\n    <span class=\"hljs-keyword\">private<\/span> User user2;\r\n\r\n    <span class=\"hljs-meta\">@Inject<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> ObjectMapper objectMapper;\r\n\r\n    <span class=\"hljs-meta\">@BeforeEach<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setup<\/span><span class=\"hljs-params\">()<\/span> {\r\n        user = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        user.setFirstName(<span class=\"hljs-string\">\"Steve\"<\/span>);\r\n        user.setLastName(<span class=\"hljs-string\">\"Rob\"<\/span>);\r\n        user.setEmail(<span class=\"hljs-string\">\"steverob@gmail.com\"<\/span>);\r\n        user.setId(<span class=\"hljs-number\">1L<\/span>);\r\n        user.setFirstLineOfAddress(<span class=\"hljs-string\">\"12 Avenue\"<\/span>);\r\n        user.setSecondLineOfAddress(<span class=\"hljs-string\">\"Commercial street\"<\/span>);\r\n        user.setTown(<span class=\"hljs-string\">\"London\"<\/span>);\r\n        user.setPostCode(<span class=\"hljs-string\">\"HA6 0EW\"<\/span>);\r\n\r\n        user2 = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        user2.setFirstName(<span class=\"hljs-string\">\"Stev\"<\/span>);\r\n        user2.setLastName(<span class=\"hljs-string\">\"Ro\"<\/span>);\r\n        user2.setEmail(<span class=\"hljs-string\">\"stevob@gmail.com\"<\/span>);\r\n        user2.setId(<span class=\"hljs-number\">2L<\/span>);\r\n        user2.setFirstLineOfAddress(<span class=\"hljs-string\">\"13 Avenue\"<\/span>);\r\n        user2.setSecondLineOfAddress(<span class=\"hljs-string\">\"Commercial street\"<\/span>);\r\n        user2.setTown(<span class=\"hljs-string\">\"London\"<\/span>);\r\n        user2.setPostCode(<span class=\"hljs-string\">\"HA7 0EW\"<\/span>);\r\n\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testGetUser<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> Exception {\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">expected<\/span> <span class=\"hljs-operator\">=<\/span> objectMapper.writeValueAsString(user);\r\n        when(userService.getUserById(anyLong())).thenReturn(user);\r\n        <span class=\"hljs-type\">var<\/span> <span class=\"hljs-variable\">response<\/span> <span class=\"hljs-operator\">=<\/span> given().contentType(ContentType.JSON)\r\n                .when()\r\n                .get(<span class=\"hljs-string\">\"\/api\/users\/\"<\/span> + user.getId())\r\n                .then()\r\n                .statusCode(Response.Status.OK.getStatusCode())\r\n                .extract();\r\n\r\n        assertEquals(expected, response.asString());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testGetAllUsers<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> Exception {\r\n        List&lt;User&gt; users = Arrays.asList(user, user2);\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">expected<\/span> <span class=\"hljs-operator\">=<\/span> objectMapper.writeValueAsString(users);\r\n        when(userService.getUsers()).thenReturn(users);\r\n        <span class=\"hljs-type\">var<\/span> <span class=\"hljs-variable\">response<\/span> <span class=\"hljs-operator\">=<\/span> given().contentType(ContentType.JSON)\r\n                .when()\r\n                .get(<span class=\"hljs-string\">\"\/api\/users\"<\/span>)\r\n                .then()\r\n                .statusCode(Response.Status.OK.getStatusCode())\r\n                .extract();\r\n        assertEquals(expected, response.asString());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testCreateUser<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> Exception {\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">expected<\/span> <span class=\"hljs-operator\">=<\/span> objectMapper.writeValueAsString(user);\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">request<\/span> <span class=\"hljs-operator\">=<\/span> expected.replace(<span class=\"hljs-string\">\"\\\"id\\\":1,\"<\/span>, <span class=\"hljs-string\">\"\"<\/span>);\r\n        when(userService.createUser(any(User.class))).thenReturn(user);\r\n        <span class=\"hljs-type\">var<\/span> <span class=\"hljs-variable\">response<\/span> <span class=\"hljs-operator\">=<\/span> given().contentType(ContentType.JSON)\r\n                .accept(ContentType.JSON)\r\n                .body(request)\r\n                .when()\r\n                .post(<span class=\"hljs-string\">\"\/api\/users\"<\/span>)\r\n                .then()\r\n                .statusCode(Response.Status.OK.getStatusCode())\r\n                .extract();\r\n        assertEquals(expected, response.asString());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testUpdateUser<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> Exception {\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">updateUser<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        updateUser.setFirstName(<span class=\"hljs-string\">\"Steveupdated\"<\/span>);\r\n        updateUser.setLastName(<span class=\"hljs-string\">\"Robupdated\"<\/span>);\r\n        updateUser.setEmail(<span class=\"hljs-string\">\"steverobupdated@gmail.com\"<\/span>);\r\n        updateUser.setFirstLineOfAddress(<span class=\"hljs-string\">\"12 Avenueupdated\"<\/span>);\r\n        updateUser.setSecondLineOfAddress(<span class=\"hljs-string\">\"Commercial streetupdated\"<\/span>);\r\n        updateUser.setTown(<span class=\"hljs-string\">\"London\"<\/span>);\r\n        updateUser.setPostCode(<span class=\"hljs-string\">\"HA6 0EW\"<\/span>);\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">updateUserWithId<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">ModelMapper<\/span>().map(updateUser, updateUserWithId);\r\n        updateUserWithId.setId(<span class=\"hljs-number\">1L<\/span>);\r\n        <span class=\"hljs-comment\">\/\/Exclude null values<\/span>\r\n        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">putBody<\/span> <span class=\"hljs-operator\">=<\/span> objectMapper.writeValueAsString(updateUser);\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">expectedResponse<\/span> <span class=\"hljs-operator\">=<\/span> objectMapper.writeValueAsString(updateUserWithId);\r\n        when(userService.updateUser(anyLong(), any(User.class))).thenReturn(updateUserWithId);\r\n        <span class=\"hljs-type\">var<\/span> <span class=\"hljs-variable\">response<\/span> <span class=\"hljs-operator\">=<\/span> given().contentType(ContentType.JSON)\r\n                .accept(ContentType.JSON)\r\n                .body(putBody)\r\n                .when()\r\n                .put(<span class=\"hljs-string\">\"\/api\/users\/{userId}\"<\/span>, updateUserWithId.getId())\r\n                .then()\r\n                .statusCode(Response.Status.OK.getStatusCode())\r\n                .extract();\r\n        assertEquals(expectedResponse, response.asString());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testPatchUpdateUser<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> Exception {\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">updateUser<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        updateUser.setFirstName(<span class=\"hljs-string\">\"Steveupdated\"<\/span>);\r\n        updateUser.setLastName(<span class=\"hljs-string\">\"Robupdated\"<\/span>);\r\n        user.setFirstName(updateUser.getFirstName());\r\n        user.setLastName(updateUser.getLastName());\r\n        <span class=\"hljs-comment\">\/\/Exclude null values<\/span>\r\n        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">patchBody<\/span> <span class=\"hljs-operator\">=<\/span> objectMapper.writeValueAsString(updateUser);\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">expectedResponse<\/span> <span class=\"hljs-operator\">=<\/span> objectMapper.writeValueAsString(user);\r\n        when(userService.patchUpdateUser(anyLong(), any(User.class))).thenReturn(user);\r\n        <span class=\"hljs-type\">var<\/span> <span class=\"hljs-variable\">response<\/span> <span class=\"hljs-operator\">=<\/span> given().contentType(ContentType.JSON)\r\n                .accept(ContentType.JSON)\r\n                .body(patchBody)\r\n                .when()\r\n                .patch(<span class=\"hljs-string\">\"\/api\/users\/{userId}\"<\/span>, user.getId())\r\n                .then()\r\n                .statusCode(Response.Status.OK.getStatusCode())\r\n                .extract();\r\n        assertEquals(expectedResponse, response.asString());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testDeleteUser<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> Exception {\r\n        doNothing().when(userService).deleteUser(anyLong());\r\n        <span class=\"hljs-type\">var<\/span> <span class=\"hljs-variable\">response<\/span> <span class=\"hljs-operator\">=<\/span> given().contentType(ContentType.JSON)\r\n                .accept(ContentType.JSON)\r\n                .when()\r\n                .delete(<span class=\"hljs-string\">\"\/api\/users\/{userId}\"<\/span>, user.getId())\r\n                .then()\r\n                .statusCode(Response.Status.NO_CONTENT.getStatusCode())\r\n                .extract();\r\n        assertEquals(<span class=\"hljs-string\">\"\"<\/span>, response.asString());\r\n    }\r\n}<\/span><\/pre>\n<figure class=\"nx ny nz oa ob oo ol om paragraph-image\">\n<div class=\"op oq ee or bg os\" tabindex=\"0\" role=\"button\">\n<div class=\"ol om on\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*5PDL3zYntI6lduJmSI0w7Q.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*5PDL3zYntI6lduJmSI0w7Q.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*5PDL3zYntI6lduJmSI0w7Q.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*5PDL3zYntI6lduJmSI0w7Q.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*5PDL3zYntI6lduJmSI0w7Q.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*5PDL3zYntI6lduJmSI0w7Q.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*5PDL3zYntI6lduJmSI0w7Q.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*5PDL3zYntI6lduJmSI0w7Q.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*5PDL3zYntI6lduJmSI0w7Q.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*5PDL3zYntI6lduJmSI0w7Q.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*5PDL3zYntI6lduJmSI0w7Q.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*5PDL3zYntI6lduJmSI0w7Q.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*5PDL3zYntI6lduJmSI0w7Q.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*5PDL3zYntI6lduJmSI0w7Q.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img loading=\"lazy\" class=\"bg la ot c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*5PDL3zYntI6lduJmSI0w7Q.png\" alt=\"\" width=\"700\" height=\"182\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<h2 id=\"d628\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Service Layer Tests<\/h2>\n<pre class=\"nx ny nz oa ob oc od oe bo of ba bj\"><span id=\"cf69\" class=\"og mq fr od b bf oh oi l oj ok\" data-selectable-paragraph=\"\"><span class=\"hljs-meta\">@QuarkusTest<\/span>\r\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">UserServiceImplTest<\/span> {\r\n\r\n    <span class=\"hljs-meta\">@InjectMocks<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> UserServiceImpl userService;\r\n\r\n    <span class=\"hljs-meta\">@Mock<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> UsersRepository usersRepository;\r\n\r\n    <span class=\"hljs-keyword\">private<\/span> User user;\r\n    <span class=\"hljs-keyword\">private<\/span> User user2;\r\n\r\n    <span class=\"hljs-meta\">@BeforeEach<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setUp<\/span><span class=\"hljs-params\">()<\/span> {\r\n        MockitoAnnotations.initMocks(<span class=\"hljs-built_in\">this<\/span>);\r\n        user = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        user.setId(<span class=\"hljs-number\">1L<\/span>);\r\n        user.setFirstName(<span class=\"hljs-string\">\"Steve\"<\/span>);\r\n        user.setLastName(<span class=\"hljs-string\">\"Rob\"<\/span>);\r\n        user.setEmail(<span class=\"hljs-string\">\"steverob@gmail.com\"<\/span>);\r\n        user.setFirstLineOfAddress(<span class=\"hljs-string\">\"10 Oliver\"<\/span>);\r\n        user.setSecondLineOfAddress(<span class=\"hljs-string\">\"Commercial street\"<\/span>);\r\n        user.setTown(<span class=\"hljs-string\">\"London\"<\/span>);\r\n        user.setPostCode(<span class=\"hljs-string\">\"HA4 7EW\"<\/span>);\r\n        user2 = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        user2.setId(<span class=\"hljs-number\">2L<\/span>);\r\n        user2.setFirstName(<span class=\"hljs-string\">\"Tony\"<\/span>);\r\n        user2.setLastName(<span class=\"hljs-string\">\"Taylor\"<\/span>);\r\n        user2.setEmail(<span class=\"hljs-string\">\"tonytaylor@gmail.com\"<\/span>);\r\n        user2.setFirstLineOfAddress(<span class=\"hljs-string\">\"12 Avenue\"<\/span>);\r\n        user2.setSecondLineOfAddress(<span class=\"hljs-string\">\"Avenue street\"<\/span>);\r\n        user2.setTown(<span class=\"hljs-string\">\"London\"<\/span>);\r\n        user2.setPostCode(<span class=\"hljs-string\">\"HA6 0EW\"<\/span>);\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testGetUserById<\/span><span class=\"hljs-params\">()<\/span> {\r\n        when(usersRepository.findById(anyLong())).thenReturn(Optional.of(user));\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">userFound<\/span> <span class=\"hljs-operator\">=<\/span> userService.getUserById(user.getId());\r\n        assertNotNull(userFound);\r\n        assertEquals(user.getId(), userFound.getId());\r\n        assertEquals(user.getEmail(), userFound.getEmail());\r\n        assertEquals(user.getFirstName(), userFound.getFirstName());\r\n        assertEquals(user.getLastName(), userFound.getLastName());\r\n        assertEquals(user.getPostCode(), userFound.getPostCode());\r\n        assertEquals(user.getFirstLineOfAddress(), userFound.getFirstLineOfAddress());\r\n        assertEquals(user.getSecondLineOfAddress(), userFound.getSecondLineOfAddress());\r\n        assertEquals(user.getTown(), userFound.getTown());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">shouldThrowExceptionWhenGetUserHasWrongId<\/span><span class=\"hljs-params\">()<\/span> {\r\n        when(usersRepository.findById(anyLong())).thenReturn(Optional.empty());\r\n        assertThrows(RuntimeException.class, () -&gt; userService.getUserById(<span class=\"hljs-number\">10000L<\/span>));\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testGetUsers<\/span><span class=\"hljs-params\">()<\/span> {\r\n        List&lt;User&gt; users = Arrays.asList(user, user2);\r\n        when(usersRepository.findAll()).thenReturn(users);\r\n        List&lt;User&gt; usersReceived = userService.getUsers();\r\n        assertEquals(users, usersReceived);\r\n        assertEquals(users.size(), usersReceived.size());\r\n        assertEquals(users.get(<span class=\"hljs-number\">0<\/span>).getId(), usersReceived.get(<span class=\"hljs-number\">0<\/span>).getId());\r\n        assertEquals(users.get(<span class=\"hljs-number\">0<\/span>).getFirstName(), usersReceived.get(<span class=\"hljs-number\">0<\/span>).getFirstName());\r\n        assertEquals(users.get(<span class=\"hljs-number\">0<\/span>).getLastName(), usersReceived.get(<span class=\"hljs-number\">0<\/span>).getLastName());\r\n        assertEquals(users.get(<span class=\"hljs-number\">0<\/span>).getEmail(), usersReceived.get(<span class=\"hljs-number\">0<\/span>).getEmail());\r\n        assertEquals(users.get(<span class=\"hljs-number\">0<\/span>).getFirstLineOfAddress(), usersReceived.get(<span class=\"hljs-number\">0<\/span>).getFirstLineOfAddress());\r\n        assertEquals(users.get(<span class=\"hljs-number\">0<\/span>).getSecondLineOfAddress(), usersReceived.get(<span class=\"hljs-number\">0<\/span>).getSecondLineOfAddress());\r\n        assertEquals(users.get(<span class=\"hljs-number\">0<\/span>).getSecondLineOfAddress(), usersReceived.get(<span class=\"hljs-number\">0<\/span>).getSecondLineOfAddress());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testCreateUser<\/span><span class=\"hljs-params\">()<\/span> {\r\n        when(usersRepository.findByEmail(anyString())).thenReturn(Optional.empty());\r\n        when(usersRepository.save(any(User.class))).thenReturn(user);\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">createNewUser<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        createNewUser.setFirstName(user.getFirstName());\r\n        createNewUser.setLastName(user.getLastName());\r\n        createNewUser.setEmail(user.getEmail());\r\n        createNewUser.setPostCode(user.getPostCode());\r\n        createNewUser.setFirstLineOfAddress(user.getFirstLineOfAddress());\r\n        createNewUser.setSecondLineOfAddress(user.getSecondLineOfAddress());\r\n        createNewUser.setTown(user.getTown());\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">createdUser<\/span> <span class=\"hljs-operator\">=<\/span> userService.createUser(createNewUser);\r\n        assertNotNull(createdUser);\r\n        assertEquals(user.getId(), createdUser.getId());\r\n        assertEquals(user.getEmail(), createdUser.getEmail());\r\n        assertEquals(user.getFirstName(), createdUser.getFirstName());\r\n        assertEquals(user.getLastName(), createdUser.getLastName());\r\n        assertEquals(user.getPostCode(), createdUser.getPostCode());\r\n        assertEquals(user.getFirstLineOfAddress(), createdUser.getFirstLineOfAddress());\r\n        assertEquals(user.getSecondLineOfAddress(), createdUser.getSecondLineOfAddress());\r\n        assertEquals(user.getTown(), createdUser.getTown());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testUpdateUser<\/span><span class=\"hljs-params\">()<\/span> {\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">updateUser<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        updateUser.setFirstName(<span class=\"hljs-string\">\"Steve\"<\/span>);\r\n        updateUser.setLastName(<span class=\"hljs-string\">\"Rob\"<\/span>);\r\n        updateUser.setEmail(<span class=\"hljs-string\">\"steverob@gmail.com\"<\/span>);\r\n        updateUser.setPostCode(<span class=\"hljs-string\">\"HA5 2EW\"<\/span>);\r\n        updateUser.setFirstLineOfAddress(<span class=\"hljs-string\">\"10 Oliver\"<\/span>);\r\n        updateUser.setSecondLineOfAddress(<span class=\"hljs-string\">\"Commercial street\"<\/span>);\r\n        updateUser.setTown(<span class=\"hljs-string\">\"London\"<\/span>);\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">updateUserWithId<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">ModelMapper<\/span>().map(updateUser, updateUserWithId);\r\n        updateUserWithId.setId(<span class=\"hljs-number\">1L<\/span>);\r\n        when(usersRepository.findById(anyLong())).thenReturn(Optional.of(updateUserWithId));\r\n        when(usersRepository.save(any(User.class))).thenReturn(updateUserWithId);\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">savedUser<\/span> <span class=\"hljs-operator\">=<\/span> userService.updateUser(updateUserWithId.getId(), updateUser);\r\n        assertNotNull(savedUser);\r\n        assertEquals(updateUserWithId.getId(), savedUser.getId());\r\n        assertEquals(updateUserWithId.getEmail(), savedUser.getEmail());\r\n        assertEquals(updateUserWithId.getFirstName(), savedUser.getFirstName());\r\n        assertEquals(updateUserWithId.getLastName(), savedUser.getLastName());\r\n        assertEquals(updateUserWithId.getPostCode(), savedUser.getPostCode());\r\n        assertEquals(updateUserWithId.getFirstLineOfAddress(), savedUser.getFirstLineOfAddress());\r\n        assertEquals(updateUserWithId.getSecondLineOfAddress(), savedUser.getSecondLineOfAddress());\r\n        assertEquals(updateUserWithId.getTown(), savedUser.getTown());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testPatchUpdateUser<\/span><span class=\"hljs-params\">()<\/span> {\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">updateUser<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        updateUser.setFirstName(<span class=\"hljs-string\">\"Steveupdated\"<\/span>);\r\n        updateUser.setLastName(<span class=\"hljs-string\">\"Robupdated\"<\/span>);\r\n        user.setFirstName(updateUser.getFirstName());\r\n        user.setLastName(updateUser.getLastName());\r\n        when(usersRepository.findById(anyLong())).thenReturn(Optional.of(user));\r\n        when(usersRepository.save(any(User.class))).thenReturn(user);\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">savedUser<\/span> <span class=\"hljs-operator\">=<\/span> userService.patchUpdateUser(user.getId(), updateUser);\r\n        assertNotNull(savedUser);\r\n        assertEquals(user.getId(), savedUser.getId());\r\n        assertEquals(user.getEmail(), savedUser.getEmail());\r\n        assertEquals(user.getFirstName(), savedUser.getFirstName());\r\n        assertEquals(user.getLastName(), savedUser.getLastName());\r\n        assertEquals(user.getPostCode(), savedUser.getPostCode());\r\n        assertEquals(user.getFirstLineOfAddress(), savedUser.getFirstLineOfAddress());\r\n        assertEquals(user.getSecondLineOfAddress(), savedUser.getSecondLineOfAddress());\r\n        assertEquals(user.getTown(), savedUser.getTown());\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testDeleteUser<\/span><span class=\"hljs-params\">()<\/span> {\r\n        when(usersRepository.findById(anyLong())).thenReturn(Optional.of(user));\r\n        doNothing().when(usersRepository).delete(any(User.class));\r\n        userService.deleteUser(user.getId());\r\n        verify(usersRepository, times(<span class=\"hljs-number\">1<\/span>)).deleteById(user.getId());\r\n    }\r\n}<\/span><\/pre>\n<figure class=\"nx ny nz oa ob oo ol om paragraph-image\">\n<div class=\"op oq ee or bg os\" tabindex=\"0\" role=\"button\">\n<div class=\"ol om on\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*3bz_TFVazbAK_DiqCuh2_A.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*3bz_TFVazbAK_DiqCuh2_A.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*3bz_TFVazbAK_DiqCuh2_A.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*3bz_TFVazbAK_DiqCuh2_A.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*3bz_TFVazbAK_DiqCuh2_A.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*3bz_TFVazbAK_DiqCuh2_A.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*3bz_TFVazbAK_DiqCuh2_A.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img loading=\"lazy\" class=\"bg la ot c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*3bz_TFVazbAK_DiqCuh2_A.png\" alt=\"\" width=\"700\" height=\"100\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<h2 id=\"c47c\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Repository Layer Tests<\/h2>\n<pre class=\"nx ny nz oa ob oc od oe bo of ba bj\"><span id=\"7856\" class=\"og mq fr od b bf oh oi l oj ok\" data-selectable-paragraph=\"\"><span class=\"hljs-meta\">@QuarkusTest<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">UserRepositoryTest<\/span> {\r\n    <span class=\"hljs-meta\">@Inject<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> UsersRepository usersRepository;\r\n\r\n    <span class=\"hljs-meta\">@Inject<\/span>\r\n    UserService userService;\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testFndByEmail<\/span><span class=\"hljs-params\">()<\/span> {\r\n        <span class=\"hljs-comment\">\/\/Given<\/span>\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">user<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        user.setFirstName(<span class=\"hljs-string\">\"Steve\"<\/span>);\r\n        user.setLastName(<span class=\"hljs-string\">\"Rob\"<\/span>);\r\n        user.setEmail(UUID.randomUUID().toString() + <span class=\"hljs-string\">\"@gmail.com\"<\/span>);\r\n        user.setFirstLineOfAddress(<span class=\"hljs-string\">\"10 Oliver\"<\/span>);\r\n        user.setSecondLineOfAddress(<span class=\"hljs-string\">\"Commercial street\"<\/span>);\r\n        user.setTown(<span class=\"hljs-string\">\"London\"<\/span>);\r\n        user.setPostCode(<span class=\"hljs-string\">\"HA4 7EW\"<\/span>);\r\n        userService.createUser(user);\r\n        <span class=\"hljs-comment\">\/\/When<\/span>\r\n        <span class=\"hljs-type\">User<\/span> <span class=\"hljs-variable\">found<\/span> <span class=\"hljs-operator\">=<\/span> usersRepository.findByEmail(user.getEmail()).get();\r\n        <span class=\"hljs-comment\">\/\/Then<\/span>\r\n        assertEquals(user.getEmail(), found.getEmail());\r\n    }\r\n}<\/span><\/pre>\n<figure class=\"nx ny nz oa ob oo ol om paragraph-image\">\n<div class=\"op oq ee or bg os\" tabindex=\"0\" role=\"button\">\n<div class=\"ol om on\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*nxlgWvm4FeIC8K5EjylC0Q.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*nxlgWvm4FeIC8K5EjylC0Q.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*nxlgWvm4FeIC8K5EjylC0Q.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*nxlgWvm4FeIC8K5EjylC0Q.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*nxlgWvm4FeIC8K5EjylC0Q.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*nxlgWvm4FeIC8K5EjylC0Q.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*nxlgWvm4FeIC8K5EjylC0Q.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*nxlgWvm4FeIC8K5EjylC0Q.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*nxlgWvm4FeIC8K5EjylC0Q.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*nxlgWvm4FeIC8K5EjylC0Q.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*nxlgWvm4FeIC8K5EjylC0Q.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*nxlgWvm4FeIC8K5EjylC0Q.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*nxlgWvm4FeIC8K5EjylC0Q.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*nxlgWvm4FeIC8K5EjylC0Q.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img loading=\"lazy\" class=\"bg la ot c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*nxlgWvm4FeIC8K5EjylC0Q.png\" alt=\"\" width=\"700\" height=\"100\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<h2 id=\"30ed\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Integration Tests<\/h2>\n<pre class=\"nx ny nz oa ob oc od oe bo of ba bj\"><span id=\"c534\" class=\"og mq fr od b bf oh oi l oj ok\" data-selectable-paragraph=\"\"><span class=\"hljs-meta\">@QuarkusTest<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">UserRestIT<\/span> {\r\n\r\n    <span class=\"hljs-keyword\">private<\/span> User user;\r\n\r\n    <span class=\"hljs-meta\">@Inject<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> ObjectMapper objectMapper;\r\n\r\n    <span class=\"hljs-meta\">@BeforeEach<\/span>\r\n    <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">setup<\/span><span class=\"hljs-params\">()<\/span> {\r\n        user = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title.class\">User<\/span>();\r\n        user.setFirstName(<span class=\"hljs-string\">\"Steve\"<\/span>);\r\n        user.setLastName(<span class=\"hljs-string\">\"Rob\"<\/span>);\r\n        user.setEmail(UUID.randomUUID().toString() + <span class=\"hljs-string\">\"@gmail.com\"<\/span>);\r\n        user.setId(<span class=\"hljs-number\">1L<\/span>);\r\n        user.setFirstLineOfAddress(<span class=\"hljs-string\">\"12 Avenue\"<\/span>);\r\n        user.setSecondLineOfAddress(<span class=\"hljs-string\">\"Commercial street\"<\/span>);\r\n        user.setTown(<span class=\"hljs-string\">\"London\"<\/span>);\r\n        user.setPostCode(<span class=\"hljs-string\">\"HA6 0EW\"<\/span>);\r\n\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Test<\/span>\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title.function\">testCreateUser<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">throws<\/span> Exception {\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">expected<\/span> <span class=\"hljs-operator\">=<\/span> objectMapper.writeValueAsString(user);\r\n        <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">request<\/span> <span class=\"hljs-operator\">=<\/span> expected.replace(<span class=\"hljs-string\">\"\\\"id\\\":1,\"<\/span>, <span class=\"hljs-string\">\"\"<\/span>);\r\n        given().contentType(ContentType.JSON)\r\n                .accept(ContentType.JSON)\r\n                .body(request)\r\n                .when()\r\n                .post(<span class=\"hljs-string\">\"\/api\/users\"<\/span>)\r\n                .then()\r\n                .statusCode(Response.Status.OK.getStatusCode())\r\n                .body(<span class=\"hljs-string\">\"firstName\"<\/span>, is(user.getFirstName()))\r\n                .body(<span class=\"hljs-string\">\"lastName\"<\/span>, is(user.getLastName()))\r\n                .body(<span class=\"hljs-string\">\"email\"<\/span>, is(user.getEmail()))\r\n                .body(<span class=\"hljs-string\">\"firstLineOfAddress\"<\/span>, is(user.getFirstLineOfAddress()))\r\n                .body(<span class=\"hljs-string\">\"secondLineOfAddress\"<\/span>, is(user.getSecondLineOfAddress()))\r\n                .body(<span class=\"hljs-string\">\"town\"<\/span>, is(user.getTown()))\r\n                .body(<span class=\"hljs-string\">\"postCode\"<\/span>, is(user.getPostCode()));\r\n    }\r\n}<\/span><\/pre>\n<figure class=\"nx ny nz oa ob oo ol om paragraph-image\">\n<div class=\"op oq ee or bg os\" tabindex=\"0\" role=\"button\">\n<div class=\"ol om on\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*3bz_TFVazbAK_DiqCuh2_A.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \/><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*3bz_TFVazbAK_DiqCuh2_A.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*3bz_TFVazbAK_DiqCuh2_A.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*3bz_TFVazbAK_DiqCuh2_A.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*3bz_TFVazbAK_DiqCuh2_A.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*3bz_TFVazbAK_DiqCuh2_A.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*3bz_TFVazbAK_DiqCuh2_A.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*3bz_TFVazbAK_DiqCuh2_A.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \/><img loading=\"lazy\" class=\"bg la ot c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*3bz_TFVazbAK_DiqCuh2_A.png\" alt=\"\" width=\"700\" height=\"100\" \/><\/picture><\/div>\n<\/div>\n<\/figure>\n<h2 id=\"ca49\" class=\"mp mq fr be mr ms mt mu mv mw mx my mz mb na nb nc mf nd ne nf mj ng nh ni nj bj\" data-selectable-paragraph=\"\">Code Location<\/h2>\n<p><a href=\"https:\/\/github.com\/ranjesh1\/quarkus-rest-services\/\">https:\/\/github.com\/ranjesh1\/quarkus-rest-services\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quarkus Overview Quarkus is a full-stack, Kubernetes-native\u00a0Java framework\u00a0made for Java virtual machines (JVMs) and native compilation, optimising Java specifically for containers and enabling it to become an effective platform for\u00a0serverless,\u00a0cloud, and\u00a0Kubernetes\u00a0environments. Quarkus is designed to work with popular Java standards, frameworks, and libraries like Eclipse MicroProfile and Spring, as well as Apache Kafka, RESTEasy (JAX-RS), &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/ranjeshviswa.com\/?p=158\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Quarkus for Spring Boot Developers&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":166,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[20,21,22,25,24,26,16,18,19,17,23],"tags":[],"_links":{"self":[{"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/posts\/158"}],"collection":[{"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=158"}],"version-history":[{"count":26,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/posts\/158\/revisions"}],"predecessor-version":[{"id":189,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/posts\/158\/revisions\/189"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=\/wp\/v2\/media\/166"}],"wp:attachment":[{"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ranjeshviswa.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}