Чтобы дать немного фона на то, что я пытаюсь сделать, пожалуйста, обратитесь мой предыдущий вопрос:Сравните возвращаемое значение метода, когда ожидается тип возврата и возвращаемое значение передаются как параметры строки
Run a java method by passing class name and method name as parameter
Поэтому в основном я пытаюсь вызвать метод и проверить его возвращаемое значение. Я прочитаю следующие параметры из xml или базы данных: класс метода, имя, параметры и возвращаемое значение. Затем я буду выполнять метод и сравнить результат.
код выглядит так, как сейчас:
public static void main(String[] args) throws IOException {
runTheMethod("CarBean","getColor","java.lang.String","Red");
}
public static void runTheMethod(String className, String methodName, String expectedReturnType, Object expectedReturnValue){
try {
Object classObj = Class.forName(className).newInstance();
Method method = classObj.getClass().getMethod(methodName);
Object returnVal = method.invoke(classObj);
if(expectedReturnValue.getClass().getName().equals(expectedReturnType)){
// This is the problem portion
System.out.println("Test passed : " + expectedReturnValue.equals(returnVal));
}else{
System.out.println("Expected return object type does not match actual return object type");
}
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Carbean это определяется пользователем POJO:
public class CarBean {
private String brand;
private String color = "Red";
public CarBean(){
}
public CarBean (String brand, String color){
this.brand= brand;
this.color= color;
}
/**
* @return the brand
*/
public String getBrand() {
return brand;
}
/**
* @param the brand to set
*/
public void setBrand(String brand) {
this.brand= brand;
}
/**
* @return the color
*/
public String getColor() {
return color;
}
/**
* @param the color to set
*/
public void setColor(String color) {
this.color= color;
}
@Override
public boolean equals(Object o){
if(o == null)
return false;
if(!(o instanceof CarBean))
return false;
CarBean other = (CarBean) o;
if(this.brand!=null && this.color!=null){
if(this.brand.equals(other.brand) && this.color.equals(other.color))
return true;
else
return false;
}else{
return false;
}
}
@Override
public int hashCode() {
int hash = 17;
hash = 31 * hash + this.brand.hashCode();
hash = 31 * hash + this.color.hashCode();
return hash;
}
}
Теперь это работает отлично для текущего кода - тип возвращаемого значения является строка, и я могу сравните с помощью equals. Но что, если метод возвращает BigDecimal или List? Существует ли общий способ сравнения нескольких типов объектов?
Я предполагаю, что для пользовательских java beans (pojo) я могу переопределить equals() и hashcode(), чтобы сравнить его. Ссылаясь на мой блог для деталей: http://javareferencegv.blogspot.com/2014/10/overriding-equals-and-hashcode-for-pojo.html
Любое дальнейшее предложение приветствуется.
Да, вы можете использовать 'equals'. Наверное, я не совсем понимаю, в чем проблема. Хотя ваша реализация 'equals' и' hashCode' в 'CarBean', возможно, неверна из-за неправильного ввода полей нулевого экземпляра. – Radiodef
@Radiodef вид возврата может быть любым. Он не может все время переопределять равные. Кроме того, что вы видите с обработкой нулевых полей? –
Я в основном пытаюсь создать общий код. Он выполнит метод и сравнивает возвращаемое значение с ожидаемым значением. Проблема заключается в том, что я буду запускать один и тот же код для каждого метода, а возвращаемые типы будут разными. Поэтому я пытаюсь сделать код, который может сравнивать любой возвращаемый тип –