JUnit Test метод, который использует другие методы в том же объекте - PullRequest
5 голосов
/ 23 февраля 2012

Здравствуйте, я борюсь с простой проблемой.

Общая идея:

class Foo(){
  public boolean method1();
  public String method2();
  public String method3();
  public String shortcut(){
    return (method1() == true) ? method2() : method3();
  }
}

Как проверить метод ярлыков?

Я знаю, как издеваться над объектами и тестировать методы, которые используют другой объект. Пример:

class Car{
  public boolean start(){};
  public boolean stop(){};
  public boolean drive(int km){};
}
class CarAutoPilot(){
  public boolean hasGotExternalDevicesAttached(){
     //Hardware specific func and api calls
     //check if gps is available 
     //check if speaker is on
     //check if display is on 
  }
  public boolean drive(Car car, int km){
    //drive
    boolean found = hasGotExternalDevicesAttached();
    boolean start = c.start();
    boolean drive = c.drive(km);
    boolean stop = c.stop();
    return (found && start && drive && stop) == true;   
  }
}

class CarAutoPilotTest(){
   @Test
   public void shouldDriveTenKm(){
     Car carMock = EasyMock.Create(Car.class);
     EasyMock.expect(carMock.start()).andReturns(true);
     EasyMock.expect(carMock.drive()).andReturns(true);
     EasyMock.expect(carMock.stop()).andReturns(true);
     EasyMock.reply(carMock);     

     CarAutoPilot cap = new CarAutoPilot();
     boolean result = cap.drive(cap,10);
     Assert.assertTrue(result);
     EasyMock.verify(carMock);
   }
}

Но как насчет метода hasGotExternalDevicesAttached ()? Это только пример, а не реальный сценарий. Как мне проверить метод драйва? Должен ли я также издеваться над функцией hasGotExternalDevicesAttached?

Могу ли я издеваться над классом, который тестируется?

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

Вы можете создать подкласс CarAutoPilot, в котором вы переопределите hasGotExternalDevicesAttached(), и запустить тест с экземпляром этого подкласса.

Вы можете сделать это встроенным:

CarAutoPilot cap = new CarAutoPilot() {
    public boolean hasGotExternalDevicesAttached(){
        // return true or false depending on what you want to test
    }
};

Таким образом, вы можете создать действительный модульный тест для остальной части поведения CarAutoPilot.

Вы можете назвать это частичной насмешкой бедняка, если хотите: -)

3 голосов
/ 23 февраля 2012

Я бы создал один тест для каждого метода. Если вы снизите сложность, то тестирование будет намного проще.

каждый из них должен пройти один тест:

  public boolean method1();
  public String method2();
  public String method3();

Нет необходимости тестировать последний метод, так как он вызывает другие ваши методы, однако, если этот метод изменяется (так как я предполагаю, что это только пример кода) и в нем больше логики, тогда у вас должен быть один метод тестирования и для этого.

Когда дело доходит до hasGotExternalDevicesAttached (), вы должны создать макет для всех внешних вызовов io, которые вы не можете протестировать.

Если вы хотите улучшить свои навыки в ходе тестирования, я бы порекомендовал вам прочитать Искусство юнит-тестирования . На мой взгляд, это лучшая книга для начинающих, чтобы изучать искусство юнит-тестирования.

1 голос
/ 23 февраля 2012

Да, вы можете, используя библиотеку EasyMock Class Extension . Ищите «Частичное издевательство» в документации EasyMock .

Идея состоит в том, чтобы смоделировать только один (или несколько) методов объекта и проверить методы, которые зависят от проверяемого метода.

...