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 কেন গুরুত্বপূর্ণ?
- ডেটা সঠিকভাবে JSON ফরম্যাটে রূপান্তর হচ্ছে কিনা তা যাচাই করা।
- JSON থেকে Java Object সঠিকভাবে তৈরি হচ্ছে কিনা তা নিশ্চিত করা।
- Missing Fields, Unknown Fields, এবং Invalid Data Handling নিশ্চিত করা।
- 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
- Positive Cases:
- Serialization এবং Deserialization-এর জন্য সঠিক JSON এবং Object ব্যবহার করুন।
- Negative Cases:
- Invalid JSON, Missing Fields, এবং Unknown Fields টেস্ট করুন।
- Boundary Conditions:
- Null, Empty JSON, এবং Complex JSON হ্যান্ডল করুন।
- Custom Logic Testing:
- Custom Serializer এবং Deserializer সঠিকভাবে কাজ করছে কিনা তা যাচাই করুন।
- Error Handling:
- Exception Management সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করুন।
উপকারিতা
- বাগ শনাক্তকরণ: Serialization এবং Deserialization সমস্যা দ্রুত শনাক্ত।
- Reliable Code: API বা ডেটা প্রসেসিং সিস্টেম আরও নির্ভরযোগ্য।
- Custom Logic Validation: Custom Serializer এবং Deserializer কার্যকারিতা নিশ্চিত।
এই পদ্ধতিগুলো অনুসরণ করে আপনি Jackson Serialization এবং Deserialization-এর জন্য শক্তিশালী Test Coverage তৈরি করতে পারবেন।
Content added By
Read more