/** First test verifies that bean builder works as expected */
  public void testLowLevelMaterializer() throws Exception {
    AbstractTypeMaterializer mat = new AbstractTypeMaterializer();
    DeserializationConfig config = new ObjectMapper().getDeserializationConfig();
    Class<?> impl = mat.materializeClass(config, config.constructType(Bean.class));
    assertNotNull(impl);
    assertTrue(Bean.class.isAssignableFrom(impl));
    // also, let's instantiate to make sure:
    Object ob = impl.newInstance();
    // and just for good measure do actual cast
    Bean bean = (Bean) ob;
    // call something to ensure generation worked...
    assertNull(bean.getA());

    // Also: let's verify that we can handle dup calls:
    Class<?> impl2 = mat.materializeClass(config, config.constructType(Bean.class));
    assertNotNull(impl2);
    assertSame(impl, impl2);
  }
 public void testLowLevelMaterializerFailOnIncompatible() throws Exception {
   AbstractTypeMaterializer mat = new AbstractTypeMaterializer();
   DeserializationConfig config = new ObjectMapper().getDeserializationConfig();
   try {
     mat.materializeClass(config, config.constructType(InvalidBean.class));
     fail("Expected exception for incompatible property types");
   } catch (IllegalArgumentException e) {
     verifyException(e, "incompatible types");
   }
 }
 public void testLowLevelMaterializerFailOnUnrecognized() throws Exception {
   AbstractTypeMaterializer mat = new AbstractTypeMaterializer();
   //  by default early failure is disabled, enable:
   mat.enable(AbstractTypeMaterializer.Feature.FAIL_ON_UNMATERIALIZED_METHOD);
   DeserializationConfig config = new ObjectMapper().getDeserializationConfig();
   try {
     mat.materializeClass(config, config.constructType(PartialBean.class));
     fail("Expected exception for unrecognized method");
   } catch (IllegalArgumentException e) {
     verifyException(e, "Unrecognized abstract method 'foobar'");
   }
 }