package org.springframework.roo.addon.javabean.addon;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.roo.classpath.PhysicalTypeMetadata;
import org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetails;
import org.springframework.roo.classpath.details.ItdTypeDetails;
import org.springframework.roo.model.JavaPackage;
import org.springframework.roo.model.JavaType;
import org.springframework.roo.model.JdkJavaType;
/**
* Unit test of {@link SerializableMetadata}
*
* @author Andrew Swan
* @since 1.2.0
*/
public class SerializableMetadataTest {
private static final String METADATA_ID =
"MID:org.springframework.roo.addon.javabean.addon.SerializableMetadata#SRC_MAIN_JAVA?com.example.Person";
@Mock
private JavaType mockAspectName;
// Fixture
@Mock
private ClassOrInterfaceTypeDetails mockClassDetails;
@Mock
private PhysicalTypeMetadata mockGovernor;
@Mock
private JavaPackage mockPackage;
@Mock
private JavaType mockTargetType;
/**
* Asserts that the ITD has the expected contents when the governor does or
* does not contain the required members
*
* @param alreadySerializable
* @param alreadyHasVersionField
*/
private void assertItdContents(final boolean alreadySerializable,
final boolean alreadyHasVersionField) {
// Set up
when(mockClassDetails.implementsType(JdkJavaType.SERIALIZABLE)).thenReturn(alreadySerializable);
when(mockClassDetails.declaresField(SerializableMetadata.SERIAL_VERSION_FIELD)).thenReturn(
alreadyHasVersionField);
final SerializableMetadata metadata =
new SerializableMetadata(METADATA_ID, mockAspectName, mockGovernor);
// Invoke
final ItdTypeDetails itd = metadata.getItdTypeDetails();
// Check
assertEquals(alreadySerializable ? 0 : 1, itd.getImplementsTypes().size());
assertEquals(alreadyHasVersionField ? 0 : 1, itd.getDeclaredFields().size());
}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mockAspectName.getPackage()).thenReturn(mockPackage);
when(mockClassDetails.getName()).thenReturn(mockTargetType);
when(mockGovernor.getMemberHoldingTypeDetails()).thenReturn(mockClassDetails);
}
@Test
public void testWhenGovernorAlreadyHasSerialVersionField() {
assertItdContents(false, true);
}
@Test
public void testWhenGovernorAlreadyImplementsSerializable() {
assertItdContents(true, false);
}
@Test
public void testWhenGovernorIsAlreadyFullySerializable() {
assertItdContents(true, true);
}
@Test
public void testWhenGovernorIsNotAtAllSerializable() {
assertItdContents(false, false);
}
}