Serialization এবং Deserialization এর Test Coverage

Jackson এর জন্য Unit Testing - জ্যাকসন (Jackson) - Java Technologies

424

JSON Serialization এবং Deserialization Jackson-এর অন্যতম গুরুত্বপূর্ণ ফিচার। API বা ডেটা প্রসেসিং অ্যাপ্লিকেশনে ডেটা সঠিকভাবে হ্যান্ডল করার জন্য Serialization এবং Deserialization প্রক্রিয়ার সঠিকতা যাচাই করা অত্যন্ত গুরুত্বপূর্ণ। Test Coverage নিশ্চিত করার জন্য JUnit এবং Mocking Framework (যেমন Mockito) ব্যবহার করা হয়।


Serialization এবং Deserialization কী?

  • Serialization: Java Object কে JSON String-এ রূপান্তর করা।
  • Deserialization: JSON String কে Java Object-এ রূপান্তর করা।

Serialization এবং Deserialization Test Coverage কেন গুরুত্বপূর্ণ?

  1. ডেটা সঠিকভাবে JSON ফরম্যাটে রূপান্তর হচ্ছে কিনা তা যাচাই করা।
  2. JSON থেকে Java Object সঠিকভাবে তৈরি হচ্ছে কিনা তা নিশ্চিত করা।
  3. Missing Fields, Unknown Fields, এবং Invalid Data Handling নিশ্চিত করা।
  4. Custom Serializer/Deserializer ঠিকমতো কাজ করছে কিনা তা যাচাই করা।

1. Serialization Test Coverage

Serialization Test Case Example:

মডেল ক্লাস:
import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL) // Exclude null fields during serialization
public class User {
    public int id;
    public String name;
    public String email;

    public User(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}
Serialization টেস্ট কোড:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class SerializationTest {

    @Test
    public void testSerialization() throws Exception {
        User user = new User(101, "John Doe", null); // Null email should be excluded

        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);

        // Validate JSON string
        assertTrue(json.contains("\"id\":101"));
        assertTrue(json.contains("\"name\":\"John Doe\""));
        assertFalse(json.contains("email")); // Email is null, so it should not be present
    }
}
আউটপুট:
Serialization Passed: JSON format is valid and excludes null fields.

2. Deserialization Test Coverage

Deserialization Test Case Example:

JSON String Example:
{
  "id": 101,
  "name": "John Doe",
  "email": "john.doe@example.com"
}
Deserialization টেস্ট কোড:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class DeserializationTest {

    @Test
    public void testDeserialization() throws Exception {
        String json = """
        {
          "id": 101,
          "name": "John Doe",
          "email": "john.doe@example.com"
        }
        """;

        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);

        // Validate Java Object
        assertEquals(101, user.id);
        assertEquals("John Doe", user.name);
        assertEquals("john.doe@example.com", user.email);
    }
}
আউটপুট:
Deserialization Passed: JSON fields correctly mapped to Java object.

3. Handling Missing and Unknown Fields

Test for Missing Fields:

@Test
public void testMissingFields() throws Exception {
    String json = """
    {
      "id": 101,
      "name": "John Doe"
    }
    """; // "email" is missing

    ObjectMapper objectMapper = new ObjectMapper();
    User user = objectMapper.readValue(json, User.class);

    // Validate Java Object
    assertEquals(101, user.id);
    assertEquals("John Doe", user.name);
    assertNull(user.email); // Email should be null
}

Test for Unknown Fields:

@Test
public void testUnknownFields() throws Exception {
    String json = """
    {
      "id": 101,
      "name": "John Doe",
      "unknownField": "extra data"
    }
    """; // Unknown field "unknownField"

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // Ignore unknown fields

    User user = objectMapper.readValue(json, User.class);

    // Validate Java Object
    assertEquals(101, user.id);
    assertEquals("John Doe", user.name);
}

4. Testing Custom Serializer and Deserializer

Custom Serializer:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

public class CustomNameSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString("Name: " + value);
    }
}

Serializer Test:

@Test
public void testCustomSerializer() throws Exception {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.addMixIn(User.class, CustomSerializerMixin.class);

    User user = new User(101, "John Doe", null);
    String json = objectMapper.writeValueAsString(user);

    // Validate custom serialization
    assertTrue(json.contains("\"name\":\"Name: John Doe\""));
}

Mixin Class:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

public abstract class CustomSerializerMixin {
    @JsonSerialize(using = CustomNameSerializer.class)
    public String name;
}

5. Testing Error Scenarios

Invalid Data:

@Test
public void testInvalidData() {
    String invalidJson = """
    {
      "id": "invalid",
      "name": "John Doe"
    }
    """;

    ObjectMapper objectMapper = new ObjectMapper();

    assertThrows(JsonMappingException.class, () -> {
        objectMapper.readValue(invalidJson, User.class);
    });
}

Null or Empty JSON:

@Test
public void testEmptyJson() throws Exception {
    String emptyJson = "{}";

    ObjectMapper objectMapper = new ObjectMapper();
    User user = objectMapper.readValue(emptyJson, User.class);

    // Validate default values
    assertEquals(0, user.id); // Default int value
    assertNull(user.name); // Null value
}

Best Practices for Test Coverage

  1. Positive Cases:
    • Serialization এবং Deserialization-এর জন্য সঠিক JSON এবং Object ব্যবহার করুন।
  2. Negative Cases:
    • Invalid JSON, Missing Fields, এবং Unknown Fields টেস্ট করুন।
  3. Boundary Conditions:
    • Null, Empty JSON, এবং Complex JSON হ্যান্ডল করুন।
  4. Custom Logic Testing:
    • Custom Serializer এবং Deserializer সঠিকভাবে কাজ করছে কিনা তা যাচাই করুন।
  5. Error Handling:
    • Exception Management সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করুন।

উপকারিতা

  • বাগ শনাক্তকরণ: Serialization এবং Deserialization সমস্যা দ্রুত শনাক্ত।
  • Reliable Code: API বা ডেটা প্রসেসিং সিস্টেম আরও নির্ভরযোগ্য।
  • Custom Logic Validation: Custom Serializer এবং Deserializer কার্যকারিতা নিশ্চিত।

এই পদ্ধতিগুলো অনুসরণ করে আপনি Jackson Serialization এবং Deserialization-এর জন্য শক্তিশালী Test Coverage তৈরি করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...