2013-12-20 6 views
1

Я пытался использовать метод Junit для метода, но тест не прошел, хотя «ожидаемый» был таким же, как «был ....». Мне интересно, в чем проблема? метод lowerRate - это всего лишь метод, который принимает в качестве входного сигнала «HotelRoom» и выдает цену со скидкой 10%. Благодаря Это мой код для теста:Junit test - Нет ошибок, которые я вижу?

@Test 
public void testLowerRate() { 
    System.out.println("lowerRate"); 
    HotelRoom room = new HotelRoom(4, 300, "N"); 
    HotelRoom instance = new HotelRoom(0, 0, "N"); 
    HotelRoom expResult = new HotelRoom(4, 270, "N"); 
    HotelRoom result = instance.lowerRate(room); 
    assertEquals(expResult, result); 

} 
@Test 
@SuppressWarnings("empty-statement") 
public void testLowerRate2() { 
    System.out.println("lowerRate"); 
    HotelRoom room = new HotelRoom(4, 100, "N"); 
    HotelRoom instance = new HotelRoom(0, 0, "N"); 
    HotelRoom expResult = new HotelRoom(4, 90, "N"); 
    HotelRoom result = instance.lowerRate(room); 
    assertEquals(expResult, result); 

} 
@Test 
public void testLowerRate3() { 
    System.out.println("lowerRate"); 
    HotelRoom room = new HotelRoom(4, 1000, "N"); 
    HotelRoom instance = new HotelRoom(0, 0, "N"); 
    HotelRoom expResult = new HotelRoom(4, 900, "N"); 
    HotelRoom result = instance.lowerRate(room); 
    assertEquals(expResult, result); 

} 
} 

EDIT ------

Вот код для программы:

class HotelRoom { 

private int numofBeds; 
private double rateperNight; 
private String YorNoceanView; 

HotelRoom(int input1, double input2, String input3) { 
    numofBeds = input1; 
    rateperNight = input2; 
    YorNoceanView = input3; 

} 

public int getnumofBeds() { 
    return numofBeds; 
} 

public void setnumofBeds(int numofBeds) { 
    this.numofBeds = numofBeds; 
} 

public double getrateperNight() { 
    return rateperNight; 
} 

public void setrateperNight(double rate) { 
    this.rateperNight = rateperNight; 
} 

public String getYorNoceanView() { 
    return YorNoceanView; 
} 

public void setYorNoceanView(String YorNoceanView) { 
    this.YorNoceanView = YorNoceanView; 
} 

@Override 
public String toString() { 
    return "Hotel Room{" + "Title= " + numofBeds + ", Rate per night= $" + rateperNight + ", Ocean View (Y or N)=" + YorNoceanView + "}"; 

} 

String roomUnder(HotelRoom room, double price) { 
    if (room.getrateperNight() > price) { 
     return "The room costs more than the given price"; 
    } 
    if (room.getrateperNight() < price) { 
     return "The room costs less than the given price"; 
    } 
    else 
     return "The room costs as much as the given price."; 
} 
HotelRoom lowerRate(HotelRoom room) { 
    room.rateperNight = 0.9 * room.rateperNight; 
    return room; 
} 
} 

public class Chpt2930HotelRoom { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

    int num1 = 1; 
    int num2 = 2; 
    String input = "input"; 

    Scanner scan = new Scanner(System.in); 
    Scanner user = new Scanner(System.in); 
    System.out.print("Enter number of Beds: "); 
    int nextLineBeds = scan.nextInt(); 
    HotelRoom HotelR = new HotelRoom(num1, num2, input); 
    HotelR.setnumofBeds(nextLineBeds); 
    System.out.println(); 


    System.out.print("Enter rate per night in Dollars: $"); 
    double nextLineRate = scan.nextDouble(); 
    HotelR.setrateperNight(nextLineRate); 
    System.out.println(); 


    System.out.print("Enter whether the room has an ocean view (Y or N): "); 
    String nextLineOcean = user.nextLine(); 
    HotelR.setYorNoceanView(nextLineOcean); 
    System.out.println(); 

    System.out.println(HotelR.toString()); 
} 
} 
+5

Покажите нам ваш 'HotelRoom' класс. Вы реализуете метод 'equals'? –

+4

Вы не переопределяете 'equals' и' hashCode' в 'HotelRoom', поэтому он наследует реализацию по умолчанию из' Object', которая использует '=='. Поскольку ваши фактические и ожидаемые результаты не совпадают, тест не проходит. Еще одно замечание заключается в том, что методы 'lowerRate' и' roomUnder' не имеют смысла - почему вы передадите _another_' HotelRoom' в 'HotelRoom' - эти методы должны действовать на сам экземпляр - т. Е.' This'. Или быть статичным. –

+2

Как вы думаете, 'assertEquals' работает? –

ответ

3

Вам не хватает чего-то очень простого. ваш метод lowerRate возвращает объект класса HotelRoom и вы выравниваете этот объект на совершенно другой экземпляр объекта с помощью метода assertEquals. Который обязательно выравнивает ссылку на объекты (поскольку вы не переоценили метод equals()). Из-за того, что они являются двумя разными объектами, их ссылки также отличаются друг от друга, и ваше утверждение терпит неудачу.

Как вы хотите, чтобы выравнивать объекты, основанные на атрибуте скорости, то вам нужно переопределить метод Equals класса HotelRoom как это:

@Override 
public boolean equals(Object obj){ 

    if(obj instanceof HotelRoom) { 
     if(Math.abs(this.rateperNight - ((HotelRoom) obj).rateperNight) < .000001) { 
      return true; 
     } 
    } 
    return false; 
} 

Только тогда ваши hotelrooms будут сравниваться как ваши ожидания.

См:

+0

По какой-то причине я получил сообщение об ошибке из-за аннотации @Override, в которой «метод не переопределяет или не реализует метод из супертипа». Почему это? Спасибо – Freedom

+1

Извините, была ошибка в методе equals, и теперь я отредактировал, и вы можете видеть сейчас. –

+0

Да, я включил его в класс HotelRoom, но он дает мне эту ошибку и не будет запускаться/компилироваться из-за этого. Есть ли что-то, что я делаю неправильно? – Freedom

3

Вы должны переопределить метод equals в ваш HotelRoom класс.

@Override 
public boolean equals(Object other){ 
    //return true if memberwise equal 
} 
+2

В зависимости от вашей IDE он может сделать это за вас. –

+4

Неверный, equals() рассказы Объект как параметр – MrBackend

+1

Вы правы, извините. Теперь это исправлено. – albusshin