Recentment, en un projecte que fa servir Spring Integration i que té tots els tests funcionant correctament alhora de d’executar el plugin de Cobertura de Maven se’m produïa el següent error a tots els tests:
Caused by: java.lang.IllegalArgumentException: Found ambiguous parameter type [interface net.sourceforge.cobertura.coveragedata.LightClassmapListener]
for method match: [public org.springframework.util.LinkedMultiValueMap cat.jaumemoron.test.MultipartReceiver.receive(org.springframework.util.LinkedMultiValueMap),
public static void cat.jaumemoron.test.MultipartReceiver.__cobertura_classmap(net.sourceforge.cobertura.coveragedata.LightClassmapListener)]
Com podia ser? Els tests executats des de l’Intellij Idea o desde Maven directament s’executaven correctament i donant el resultat esperat. El plugin de Cobertura només havia de tornar a executar els mateixos tests per analitzar la cobertura de codi! No entenia res.
La classe que s’indicava a la traça era la següent:
package cat.jaumemoron.test;
public class MultipartReceiver {
public LinkedMultiValueMap<String, Object> receive(LinkedMultiValueMap<String, Object> multipartRequest){
// Do something
return multipartRequest;
}
}
I es fa servir com a ServiceActivator en la definició següent:
<int:service-activator>
<bean class=”cat.jaumemoron.test.MultipartReceiver”/>
</int:service-activator>
Tot correcte i seguint les especificacions d’Spring; per tant, perquè fallava amb el plugin de cobertura?
Vaig estar unes hores investigant i finalment la vaig trobar a la següent pàgina que em va donar la solució: http://forum.spring.io/forum/spring-projects/integration/115701-exception-found-ambiguous-parameter-type (gràcies Sr. Google!!)
El plugin de Cobertura crea un proxy de les classes que analitza generant un mètode per cada un dels existents, amb els mateixos paràmetres d’entrada però amb un altre nom (.__cobertura_classmap en aquest cas).
Quan defineixes un Endpoint a Spring Integration, no es necessari indicar quin mètode del bean processarà el missatge si només n’hi a un que tingui com a paràmetre d’entrada l’objecte que viatjarà en el missatge del canal.
Però el plugin de cobertura al generar un proxy amb dos mètodes que poden processar el missatge, alhora d’executar-se, el test falla.
En aquest cas, per corregir el problema hem d’indicar a la definició del ServiceActivator el mètode que s’ha de fer servir per processar el missatge, quedant de la següent manera:
<int:service-activator method=”receive”>
<bean class=”cat.jaumemoron.test.MultipartReceiver”/>
</int:service-activator>
Tinguem’ho en compte per a les següents vegades. Prou boig em va fer tornar en el seu moment…