Reputation: 323
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
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