В настоящее время я работаю над модульным тестированием и пытаюсь создать тестовое тестирование различных вариантов для одной функции. Например, у меня есть следующая функция:
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()
, и это работает хорошо. Я буду держать это сообщение об обновлениях, которые я могу реализовать.