chege
chege

Reputation: 323

Spring MVC testing conversion service when using ConverterFactory

Initially I had a converter for almost every entity classes in my project. I decided to drop all those converters and created a ConverterFactory that will do all the conversion.

@Service("dataConverterFactory")
public class DataConverterFactory implements ConverterFactory<String, CommonEntity> {

    private static final Logger logger = LoggerFactory.getLogger(DataConverterFactory.class);

    private final EntityManager em;

    @Autowired
    public DataConverterFactory(EntityManager em) {
        this.em = em;
    }

    @Override
    public <T extends CommonEntity> Converter<String, T> getConverter(Class<T> targetType) {
        return new GenericConverter(targetType);
    }

    private final class GenericConverter<T extends CommonEntity> implements Converter<String, T> {

        private final Class<T> targetType;

        public GenericConverter(Class<T> targetType) {
            this.targetType = targetType;
        }

        @Override
        public T convert(String text) {
            if (text != null && !text.isEmpty() && !text.equalsIgnoreCase("-1")) {//Ignore - to be determined later
                try {
                    return (T) em.find(targetType, Integer.valueOf(text.trim()));
                } catch (Exception e) {
                    logger.error(e.getMessage(), e);
                }
            }
            return null;
        }

    }

}

This works fine but my tests are failing when conversion is required. Here is a snippet from my test xml configuration file

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="dataConverterFactory"/>
            </set>
        </property>
    </bean>
    <bean id="dataConverterFactory" class="com.xyz.converter.DataConverterFactory"/>

Sample test

  mockMvc.perform(fileUpload("/complaint/new")
            .file(file)
            .param("customer", "1")
    )

In the above test,I am trying to submit a Complaint but it will fail because customer will be null.

Parameter customer should be converted to class Customer which extends CommonEntity.

public class Complaint extends CommonEntity {

    @NotNull
    @ManyToOne
    @JoinColumn(name = "customer_id", updatable = false)
    private Customer customer;

}

How do mock/set conversion service to work in my tests?

Upvotes: 3

Views: 1877

Answers (1)

YouthLin
YouthLin

Reputation: 31

    private MockMvc mockMvc;

    @Before
    public void setUp() {
        YourController converterController = new YourController();
        FormattingConversionService cs = new FormattingConversionService();
        cs.addConverter(new YourConverter());/////here
        mockMvc = MockMvcBuilders.standaloneSetup(converterController)
                 .setConversionService(cs)/////here
                 .build();
    }

Upvotes: 2

Related Questions