RecordImplicitSingleValueUsePropertiesBasedCreatorsTest.java
package com.fasterxml.jackson.databind.records;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.cfg.ConstructorDetector;
import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class RecordImplicitSingleValueUsePropertiesBasedCreatorsTest extends DatabindTestUtil
{
record RecordWithMultiValueCanonAndSingleValueAltConstructor(int id, String name) {
public RecordWithMultiValueCanonAndSingleValueAltConstructor(int id) {
this(id, "AltConstructor");
}
}
record RecordWithSingleValueCanonAndMultiValueAltConstructor(String name) {
public RecordWithSingleValueCanonAndMultiValueAltConstructor(String name, String email) {
this("AltConstructor");
}
}
private final ObjectMapper MAPPER = jsonMapperBuilder()
.annotationIntrospector(new Jdk8ConstructorParameterNameAnnotationIntrospector())
.constructorDetector(ConstructorDetector.USE_PROPERTIES_BASED)
.build();
/*
/**********************************************************************
/* Test methods, multi-value canonical constructor + single-value alt constructor
/**********************************************************************
*/
@Test
public void testDeserializeMultipleConstructors_UsingMultiValueCanonicalConstructor() throws Exception {
RecordWithMultiValueCanonAndSingleValueAltConstructor value = MAPPER.readValue(
a2q("{'id':123,'name':'Bob'}"),
RecordWithMultiValueCanonAndSingleValueAltConstructor.class);
assertEquals(new RecordWithMultiValueCanonAndSingleValueAltConstructor(123, "Bob"), value);
}
@Test
public void testDeserializeMultipleConstructors_WillIgnoreSingleValueAltConstructor() throws Exception {
RecordWithMultiValueCanonAndSingleValueAltConstructor value = MAPPER.readValue(
a2q("{'id':123}"),
RecordWithMultiValueCanonAndSingleValueAltConstructor.class);
assertEquals(new RecordWithMultiValueCanonAndSingleValueAltConstructor(123, null), value);
}
/*
/**********************************************************************
/* Test methods, single-value canonical constructor + multi-value alt constructor
/**********************************************************************
*/
@Test
public void testDeserializeMultipleConstructors_UsingSingleValueCanonicalConstructor() throws Exception {
RecordWithSingleValueCanonAndMultiValueAltConstructor value = MAPPER.readValue(
a2q("{'name':'Bob'}"),
RecordWithSingleValueCanonAndMultiValueAltConstructor.class);
assertEquals(new RecordWithSingleValueCanonAndMultiValueAltConstructor("Bob"), value);
}
@Test
public void testDeserializeMultipleConstructors_WillIgnoreMultiValueAltConstructor() throws Exception {
try {
MAPPER.readValue(a2q("{'name':'Bob','email':'bob@email.com'}"), RecordWithSingleValueCanonAndMultiValueAltConstructor.class);
} catch (UnrecognizedPropertyException e) {
verifyException(e, "Unrecognized");
verifyException(e, "\"email\"");
verifyException(e, "RecordWithSingleValueCanonAndMultiValueAltConstructor");
}
}
}