NỘI DUNG BÀI HỌC

✳️ Tại sao sử dụng POJO class?
✳️ Sử dụng POJO class để khởi tạo giá trị theo cấu trúc JSON body
✳️ Sử dụng thư viện Gson để chuyển POJO class về dạng JSON data
✳️ Xây dựng POJO class có nhiều cấp bậc

✅ Tại sao sử dụng POJO class trong Java?

POJO là viết tắt của Plain Old Java Object, một POJO là một class Java thuần không extend và không implement bất kỳ class hoặc interface nào trong project Java.

Ví dụ:

public class LoginPOJO {
    
    private String username;
    private String password;

    public LoginPOJO(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}


POJO hoạt động như một đối tượng kết hợp logic nghiệp vụ của ứng dụng, nên vì vậy chúng ta có thể sử dụng class POJO để triển khai cấu trúc của một bộ data nào đó và sử dụng các hàm getter setter cùng hàm xây dựng để khởi tạo giá trị cho bộ data theo cấu trúc mong muốn.

Ở ví dụ trên thì class POJO có 2 fields, các bạn có thể xây dựng để truyền vào data cho 2 fields đó, xong sau đó chúng ta chuyển hoá class POJO ấy về dạng JSON là có thể truyền vào Body của một API login như sau

https://api.anhtester.com/swagger/index.html#/Authentication/loginUser

{
  "username": "anhtester",
  "password": "Demo@123"
}


✅ Sử dụng POJO class để khởi tạo giá trị theo cấu trúc JSON body

Hiện tại chúng ta đang truyền cấu trúc data JSON vào Body kiểu trực tiếp dạng một chuỗi JSON

@Test
public void testLoginUser() {
    RequestSpecification request = given();
    request.baseUri("https://api.anhtester.com/api")
        .accept("application/json")
        .contentType("application/json")
        .body("{\n" +
            "  \"username\": \"anhtester\",\n" +
            "  \"password\": \"Demo@123\"\n" +
            "}");

    //Thực hiện phương thức post() để gửi dữ liệu đi
    Response response = request.when().post("/login");
    response.prettyPrint();
    response.then().statusCode(200);
}


Nếu như số lượng fields tăng lên nhiều thì sẽ dẫn đến phức tạp trong code cũng như truyền biến vào chuỗi JSON đó.

Vậy nên chúng ta sử dụng POJO class để giải quyết câu chuyện trên, bằng cách xây dựng class POJO tương ứng với từng bộ data JSON mà mình mong muốn.

Ví dụ chúng ta xây dựng class LoginPOJO để thay thế cấu trúc JSON cho API login.

🔆 Quy tắc xây dựng class POJO:

  • Có bao nhiêu fields trong JSON thì tạo bấy nhiêu biến với kiểu dữ liệu tương ứng trong class
  • Tên biến phải giống với tên fields trong JSON (phân biệt hoa thường)
  • Xây dựng đầy đủ các hàm get set và hàm xây dựng cho các biến để có thể cấp phát và truy cập dữ liệu từ biến.

Tương ứng với cấu trúc JSON của api login
{
  "username": "anhtester",
  "password": "Demo@123"
}​

Thì ta có cấu trúc class POJO như sau (nói là POJO nhưng chúng ta muốn đặt tên gì thì đặt tuỳ ý nhé)

package com.anhtester.model;

public class LoginPOJO {

    private String username;
    private String password;

    public LoginPOJO(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public LoginPOJO() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}


Tiếp theo chúng ta dùng thư viện Gson hoặc thư viện nào có thể chuyển hoá từ cấu trúc class POJO về dạng cấu trúc JSON để có thể truyền vào Body của test API.

✅ Sử dụng thư viện Gson để chuyển POJO class về dạng JSON data

Đầu tiên chúng ta cài đặt thư viện Gson vào project thông qua Maven. Dán thư viện vào file pom.xml xong build lại.

https://mvnrepository.com/artifact/com.google.code.gson/gson

Dùng phiên bản mới nhất 2.10.1 release ngày 06/01/2023 (sau này cứ lâu lâu cập nhật lên nhé, kể cả REST Assured)

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>


File pom.xml hiện tại gồm những thư viện sau, tính đến hiện tại bài học này.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.anhtester</groupId>
    <artifactId>RestAssuredTestNG2023</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>5.4.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.8.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.9</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>2.0.9</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.10.1</version>
        </dependency>

    </dependencies>

</project>


🔆 Khởi tạo data cho các biến giá trị thông qua hàm xây dựng hoặc hàm set từ POJO class

//Khởi tạo giá trị cho các fields thông qua hàm xây dựng có tham số
LoginPOJO loginPOJO = new LoginPOJO("anhtester4", "Demo@123");


Hoặc thông qua hàm set, không dùng hàm xây dựng có tham số

LoginPOJO loginPOJO = new LoginPOJO();
loginPOJO.setUsername("anhtester4");
loginPOJO.setPassword("Demo@123");


🔆 Chuyển đổi đối tượng class POJO sang dạng cấu trúc JSON ngược lại

Chúng ta sử dụng thư viện Gson mới cài đặt bên trên. Cụ thể dùng hàm toJson()

@Test
public void testLoginUser() {

    //Khởi tạo giá trị cho các fields thông qua hàm xây dựng
    LoginPOJO loginPOJO = new LoginPOJO("anhtester4", "Demo@123");

    //Dùng thư viện Gson để chuyển class POJO về dạng JSON
    Gson gson = new Gson();

    RequestSpecification request = given();
    request.baseUri("https://api.anhtester.com/api")
        .accept("application/json")
        .contentType("application/json")
        .body(gson.toJson(loginPOJO));

    Response response = request.when().post("/login");
    response.prettyPrint();

    response.then().statusCode(200);

    String token = response.getBody().path("token");
    System.out.println(token);
}


Kết quả:

{
    "token": "2550|lddW3wb3hAxqdKUA0wU6etbidDorzJcXWA0G48ja27071775"
}


Như vậy rõ ràng là chúng ta đã truyền được cấu trúc JSON vào Body của API thông qua POJO class.

Lúc này nó sẽ đỡ phức tạp hơn khi nhiều fields. Các bạn chỉ việc tạo ra nhiều biến trong class POJO thôi là được.

Tương tự chúng ta làm phần api Register User thử nhé.


🔆 Ví dụ tạo class POJO cho api Register User

https://api.anhtester.com/swagger/index.html#/Authentication/Register

{
  "username": "anhtester",
  "firstName": "Anh",
  "lastName": "Tester",
  "email": "anhtester@email.com",
  "password": "Demo@123",
  "phone": "0939206009",
  "userStatus": 1
}


Tạo POJO class tương ứng với cấu trúc JSON

package com.anhtester.model;

public class RegisterUserPOJO {

    private String username;
    private String firstName;
    private String lastName;
    private String email;
    private String password;
    private String phone;
    private int userStatus;

    public RegisterUserPOJO(String username, String firstName, String lastName, String email, String password, String phone, int userStatus) {
        this.username = username;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
        this.phone = phone;
        this.userStatus = userStatus;
    }

    public RegisterUserPOJO() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public int getUserStatus() {
        return userStatus;
    }

    public void setUserStatus(int userStatus) {
        this.userStatus = userStatus;
    }
}


Khởi tạo giá trị data cho phần Body thông qua POJO class

@Test
public void testRegisterUser() {

    //Khởi tạo giá trị cho các fields thông qua hàm xây dựng
    RegisterUserPOJO registerUserPOJO = new RegisterUserPOJO();
    registerUserPOJO.setUsername("myduyen");
    registerUserPOJO.setPassword("Demo@123");
    registerUserPOJO.setFirstName("Lê Thị");
    registerUserPOJO.setLastName("Mỹ Duyên");
    registerUserPOJO.setEmail("myduyen@email.com");
    registerUserPOJO.setPhone("0123456789");
    registerUserPOJO.setUserStatus(1);

    //Dùng thư viện Gson để chuyển class POJO về dạng JSON
    Gson gson = new Gson();

    RequestSpecification request = given();
    request.baseUri("https://api.anhtester.com/api")
        .accept("application/json")
        .contentType("application/json")
        .body(gson.toJson(registerUserPOJO));

    Response response = request.when().post("/register");
    response.prettyPrint();

    response.then().statusCode(200);

    String message = response.getBody().path("message");
    Assert.assertEquals(message, "Success", "The message not match.");
}


Kết quả:

{
    "message": "Success",
    "response": {
        "username": "myduyen",
        "firstName": "Lê Thị",
        "lastName": "Mỹ Duyên",
        "email": "myduyen@email.com",
        "phone": "0123456789",
        "userStatus": 1,
        "id": 208
    }
}

===============================================
Default Suite
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================

 

✅ Xây dựng POJO class có nhiều cấp bậc

Trường hợp trong cấu trúc JSON đầu vào có nhiều cấp bậc giữa các fields như API create book

https://restful-booker.herokuapp.com/apidoc/index.html#api-Booking-CreateBooking

{
  "firstname": "Jim",
  "lastname": "Brown",
  "totalprice": 111,
  "depositpaid": true,
  "bookingdates": {
    "checkin": "2018-01-01",
    "checkout": "2019-01-01"
  },
  "additionalneeds": "Breakfast"
}


Tại field "bookingdates" có chứa 2 fields con "checkin" và "checkout". Lúc này chúng ta cần tách các thành phần con của fields bookingdates thành một class POJO riêng.

- Class POJO: BookingDates

package com.anhtester.model;

public class BookingDates {
    private String checkin;
    private String checkout;

    public String getCheckin() {
        return checkin;
    }

    public String getCheckout() {
        return checkout;
    }

    public void setCheckin(String checkin) {
        this.checkin = checkin;
    }

    public void setCheckout(String checkout) {
        this.checkout = checkout;
    }
}


- Class POJO: BookingBody

package com.anhtester.model;

public class BookingBody {
    private String firstname;
    private String lastname;
    private int totalprice;
    private boolean depositpaid;

    //Kiểu dữ liệu là class BookingDates
    private BookingDates bookingdates;

    private String additionalneeds;

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public void setTotalprice(int totalprice) {
        this.totalprice = totalprice;
    }

    public void setDepositpaid(boolean depositpaid) {
        this.depositpaid = depositpaid;
    }

    public void setBookingdates(BookingDates bookingdates) {
        this.bookingdates = bookingdates;
    }

    public void setAdditionalneeds(String additionalneeds) {
        this.additionalneeds = additionalneeds;
    }
}


🔆 Triển khai đối tượng class POJO sang class test cases API create book

@Test
public void testCreateBooking() {

    String baseUri = "https://restful-booker.herokuapp.com";

    RequestSpecification request = given();
    request.baseUri(baseUri);
    request.header("Accept", "application/json")
        .header("Content-Type", "application/json");

    //Khởi tạo 2 class POJO
    BookingBody bookingBody = new BookingBody();
    BookingDates bookingDates = new BookingDates();

    //Set giá trị cho các fields không chứa cấp bậc
    bookingBody.setFirstname("Anh");
    bookingBody.setLastname("Tester");
    bookingBody.setTotalprice(100);
    bookingBody.setDepositpaid(true);
    bookingBody.setAdditionalneeds("Technology");

    //Set giá trị cho 2 fields con từ class POJO phụ
    bookingDates.setCheckin("2023-12-15");
    bookingDates.setCheckout("2023-12-30");

    //Set giá trị cho field Cha với 2 thông số từ fields Con
    bookingBody.setBookingdates(bookingDates);

    Gson gson = new Gson();

    //Convert POJO to JSON
    request.body(gson.toJson(bookingBody));

    Response response = request.post("/booking");
    response.prettyPrint();
    response.then().statusCode(200);
}


Kết quả:

{
    "bookingid": 758,
    "booking": {
        "firstname": "Anh",
        "lastname": "Tester",
        "totalprice": 100,
        "depositpaid": true,
        "bookingdates": {
            "checkin": "2023-12-15",
            "checkout": "2023-12-30"
        },
        "additionalneeds": "Technology"
    }
}

===============================================
Default Suite
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học