Тест с Easymock для тестирования случаев - PullRequest
0 голосов
/ 06 января 2020

В настоящее время я работаю над модульным тестированием и пытаюсь создать тестовое тестирование различных вариантов для одной функции. Например, у меня есть следующая функция:

public static String foo(Object arg0, Object arg1) {
    String returnValue = null;
    if(arg0.getName() != null && arg0.getId() != null) {
        returnValue = "Value 1";
    } else if (arg1.getName() != null && arg1.getId() != null ) {
        returnValue = "Value 2";
    }
    return returnValue;
}

Я хочу проверить следующие случаи:

  • Случай 1: arg0.getName() == null и arg1.getName() == null
  • Дело 2: arg0.getName() != null и arg0.getId() != null и arg1.getName() == null
  • Дело 3: arg0.getName() == null и arg1.getName() != null и arg1.getId() != null

et c .. .

Мой текущий тест выглядит следующим образом:

public void testFoo() {
    /** Setting up my mocks**/
    Obj arg0 = createMock(Obj.class);
    Obj arg1 = createMock(Obj.class);

    /** Setting my mocks behaviors **/

    // Case 1
    EasyMock.expect(arg0.getName()).andReturn(null);
    EasyMock.expect(arg1.getName()).andReturn(null);

    // Case 2
    EasyMock.expect(arg0.getName()).andReturn("Jack");
    EasyMock.expect(arg0.getId()).andReturn(1);
    EasyMock.expect(arg1.getName()).andReturn(null);

    // Case 3
    EasyMock.expect(arg0.getName()).andReturn(null);
    EasyMock.expect(arg1.getName()).andReturn("Paul");
    EasyMock.expect(arg1.getId()).andReturn(2);

    //End Cases
    EasyMock.replay(arg0_case1, arg0_case2, arg0_case3,

arg1_case1, arg1_case2, arg1_case3);

    /** Testing **/

    // Case 1
    String expectedValue = null;
    String output = foo(arg0, arg1);
    assertEquals(expectedValue, output);

    // Case 2
    expectedValue = "Value 1";
    output = foo(arg0, arg1);
    assertEquals(expectedValue, output);

    // Case 3
    expectedValue = "Value 2";
    output = foo(arg0, arg1);
    assertEquals(expectedValue, output);
}

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

У вас есть какие-либо решения для такого рода испытаний? Может быть, мне стоит написать разные тесты для каждого случая?


EDIT Я нашел решение благодаря решению @ swayamraina и некоторой модификации моего кода. Это не самый эффективный ответ, но он делает свою работу. Вот мой отредактированный код:

public void testFoo() {
/** Setting my mocks behaviors **/

// Case 1
Obj arg0_case1 = createMock(Obj.class);
Obj arg1_case1 = createMock(Obj.class);
EasyMock.expect(arg0_case1.getName()).andReturn(null).anyTimes();
EasyMock.expect(arg1_case1.getName()).andReturn(null).anyTimes();

// Case 2
Obj arg0_case2 = createMock(Obj.class);
Obj arg1_case2 = createMock(Obj.class);
EasyMock.expect(arg0_case2.getName()).andReturn("Jack").anyTimes();
EasyMock.expect(arg0_case2.getId()).andReturn(1).anyTimes();
EasyMock.expect(arg1_case2.getName()).andReturn(null).anyTimes();

// Case 3
Obj arg0_case3 = createMock(Obj.class);
Obj arg1_case3 = createMock(Obj.class);
EasyMock.expect(arg0_case3.getName()).andReturn(null).anyTimes();
EasyMock.expect(arg1_case3.getName()).andReturn("Paul").anyTimes();
EasyMock.expect(arg1_case3.getId()).andReturn(2).anyTimes();

//End Cases
EasyMock.replay(arg0, arg1);

/** Testing **/

// Case 1
String expectedValue = null;
String output = foo(arg0_case1, arg1_case1);
assertEquals(expectedValue, output);

// Case 2
expectedValue = "Value 1";
output = foo(arg0_case2, arg1_case2);
assertEquals(expectedValue, output);

// Case 3
expectedValue = "Value 2";
output = foo(arg0_case3, arg1_case3);
assertEquals(expectedValue, output);

Как и @swayamraina, предложенный в его ответе, я создал разные макеты для каждого теста и добавляю .anyTimes() после каждого EasyMock.expect().andReturn(), и это работает хорошо. Я буду держать это сообщение об обновлениях, которые я могу реализовать.

1 Ответ

1 голос
/ 06 января 2020

Ниже приведен обновленный тестовый пример

@Test
public void test()  {

  A arg0, arg1;

  // Case 1
  arg0 = EasyMock.createMock(A.class);
  arg1 = EasyMock.createMock(A.class);

  // expectations
  EasyMock.expect(arg0.getName()).andReturn(null).once();
  EasyMock.expect(arg1.getName()).andReturn(null).once();
  EasyMock.replay(arg0, arg1);

  // actuals
  String expectedValue = null;
  String output = foo(arg0, arg1);

  // assertions
  Assert.assertEquals(expectedValue, output);


  // Case 2
  arg0 = EasyMock.createMock(A.class);
  arg1 = EasyMock.createMock(A.class);

  // expectations
  EasyMock.expect(arg0.getName()).andReturn("Jack").once();
  EasyMock.expect(arg0.getId()).andReturn(1).once();
  EasyMock.expect(arg1.getName()).andReturn(null).once();
  EasyMock.replay(arg0, arg1);

  // actuals
  expectedValue = "Value 1";
  output = foo(arg0, arg1);

  // assertions
  Assert.assertEquals(expectedValue, output);


  // Case 3
  arg0 = EasyMock.createMock(A.class);
  arg1 = EasyMock.createMock(A.class);

  // expectations
  EasyMock.expect(arg0.getName()).andReturn(null).once();
  EasyMock.expect(arg1.getName()).andReturn("Paul").once();
  EasyMock.expect(arg1.getId()).andReturn(2).once();
  EasyMock.replay(arg0, arg1);

  // actuals
  expectedValue = "Value 2";
  output = foo(arg0, arg1);

  // assertions
  Assert.assertEquals(expectedValue, output);
}



Используемый класс теста:

class A {
    String name; public String getName() {return  name;} 
    Integer id; public Integer getId(){return id;}
}


Примечания:
Воспроизвести макеты можно только один раз. Вам нужно создавать новые тестовые объекты для каждого теста. Здесь мы сначала создаем макеты, затем устанавливаем ожидания и воспроизводим макеты. Наконец, утверждение против фактических значений.


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

  1. объявление переменных
  2. описание тестового примера
  3. установка ожиданий
  4. определение результата (фактического)
  5. применить утверждения
...