@Override public Class<?> toClass(MessageProperties properties) { Map<String, Object> headers = properties.getHeaders(); Object classIdFieldNameValue = headers.get(getClassIdFieldName()); String classId = null; if (classIdFieldNameValue != null) { classId = classIdFieldNameValue.toString(); } if (classId == null) { if (this.defaultType != null) { return this.defaultType; } else { throw new MessageConversionException( "failed to convert Message content. Could not resolve " + getClassIdFieldName() + " in header " + "and no defaultType provided"); } } return toClass(classId); }
@Test public void shouldReturnLinkedHashMapForFieldWithHashtable() { props.getHeaders().put("__TypeId__", "Hashtable"); Class<?> clazz = classMapper.toClass(props); assertThat(clazz, equalTo(LinkedHashMap.class)); }
@Test public void shouldThrowAnExceptionWhenClassIdNotPresent() { try { classMapper.toClass(props); } catch (MessageConversionException e) { String classIdFieldName = classMapper.getClassIdFieldName(); assertThat(e.getMessage(), containsString("Could not resolve " + classIdFieldName + " in header")); } }
@SuppressWarnings("unchecked") @Test public void shouldLookInTheClassIdFieldNameToFindTheClassName() { props.getHeaders().put("type", "java.lang.String"); given(classMapper.getClassIdFieldName()).willReturn("type"); Class<String> clazz = (Class<String>) classMapper.toClass(props); assertThat(clazz, equalTo(String.class)); }
@Test public void shouldUseTheCLassProvidedByTheLookupMapIfPresent() { props.getHeaders().put("__TypeId__", "trade"); classMapper.setIdClassMapping(map("trade", SimpleTrade.class)); @SuppressWarnings("rawtypes") Class clazz = classMapper.toClass(props); assertEquals(clazz, SimpleTrade.class); }
@SuppressWarnings("unchecked") @Test public void shouldUseDefaultType() { props.getHeaders().clear(); classMapper.setDefaultType(Foo.class); Class<Foo> clazz = (Class<Foo>) classMapper.toClass(props); assertSame(Foo.class, clazz); classMapper.setDefaultType(LinkedHashMap.class); }