1 package com.google.code.beanmatchers; 2 3 import java.lang.reflect.Modifier; 4 5 class DefaultTypeBasedValueGenerator implements TypeBasedValueGenerator { 6 7 private final ValueGeneratorRepository valueGeneratorRepository; 8 private final TypeBasedValueGenerator nonFinalTypeBasedValueGenerator; 9 private final TypeBasedValueGenerator enumBasedValueGenerator; 10 private final TypeBasedValueGenerator arrayValueGenerator; 11 12 public DefaultTypeBasedValueGenerator(ValueGeneratorRepository valueGeneratorRepository, 13 TypeBasedValueGenerator nonFinalTypeBasedValueGenerator, 14 TypeBasedValueGenerator enumBasedValueGenerator, 15 TypeBasedValueGenerator arrayValueGenerator) { 16 this.valueGeneratorRepository = valueGeneratorRepository; 17 this.nonFinalTypeBasedValueGenerator = nonFinalTypeBasedValueGenerator; 18 this.enumBasedValueGenerator = enumBasedValueGenerator; 19 this.arrayValueGenerator = arrayValueGenerator; 20 } 21 22 public <T> T generate(Class<T> type) { 23 ValueGenerator<T> generator = valueGeneratorRepository.retrieveValueGenerator(type); 24 if (generator != null) { 25 return generator.generate(); 26 } 27 if (!Modifier.isFinal(type.getModifiers())) { 28 return nonFinalTypeBasedValueGenerator.generate(type); 29 } 30 if (type.isEnum()) { 31 return enumBasedValueGenerator.generate(type); 32 } 33 if (type.isArray()) { 34 return arrayValueGenerator.generate(type); 35 } 36 throw new BeanMatchersException("Could not create a test value of type " + type.getName() 37 + ".\nPlease register a ValueGenerator to create the value:\n" 38 + " BeanMatchers.registerValueGenerator(new ValueGenerator<" + type.getSimpleName() 39 + ">() {\n" 40 + " public " + type.getSimpleName() + " generate() {\n" 41 + " return null; // Change to generate random instance\n" 42 + " }\n" 43 + " }, " + type.getSimpleName() + ".class);"); 44 } 45 }