View Javadoc
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  }