Псевдоним метода Java - PullRequest
       13

Псевдоним метода Java

2 голосов
/ 15 июня 2011

Я разрабатываю модульные тесты, которые могут много выиграть от повторного использования, когда дело доходит до создания тестовых данных.Однако есть разные вещи (вызовы API), которые мне нужно делать с одними и теми же тестовыми данными (аргументы API).

Мне интересно, возможна ли следующая идиома в Java.

Class RunTestScenarios {

void runScenarioOne (A a, B b, C c) {
   ........
}

void runScenarioTwo (A a, B b, C c) {
   ........
}

void runScenario (/* The scenario */  scenarioXXX) {
     A a = createTestDataA();
     B b = createTestDataB();
     C c = createTestDataC();
     scenarioXXX(a, b, c);
}

public static void main (String[] args) {
    runScenario(runScenarioOne);
    runScenario(runScenarioTwo);
}

}

По сути, я не хочу, чтобы что-то подобное повторялось повсюду:

 A a = createTestDataA();
 B b = createTestDataB();
 C c = createTestDataC();

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

Кстати, я знаю, что Command Pattern поможет это сделать.Но не то, что я ищу.

Спасибо, США

Ответы [ 4 ]

2 голосов
/ 15 июня 2011
  1. Использование jUnit.
  2. Преобразование a, b & c в поля.
  3. Использование методов jUnit setUp и tearDown для инициализации свежих объектов для каждого теста.
1 голос
/ 15 июня 2011

Я не уверен, что смогу получить то, что вам нужно, но мне кажется, что вы можете использовать DataProvider, который обеспечивает TestNG .

Это что-то вроде этого:

...
@Test(dataProvider="someMethodWithDataProviderAnnotation") 
void runScenarioOne (A a, B b, C c) {
...
}

@Test(dataProvider="someMethodWithDataProviderAnnotation") 
void runScenarioTwo (A a, B b, C c) {
...
}

А затем вы создаете свой провайдер данных:

@DataProvider(name="someMethodWithDataProviderAnnotation")
private Object [][] getTestData() {
   return new Object[]][] {{
         createTestDataA(),
         createTestDataB(),
         createTestDataC()
   }};
 } 

И все, когда вы запустите тест, они будут вызваныс правильными параметрами, которые будут созданы только один раз.Хотя это более полезно, когда вам нужно загрузить много ресурсов, например, все файлы в каталоге или что-то в этом роде.

Вы просто запускаете все методы в классе.

Подробнее читайте здесь:

http://testng.org/doc/documentation-main.html#parameters-dataproviders

Кстати: TestNG включен как плагин в IntelljИДЕЯ

1 голос
/ 15 июня 2011

Нет, вы не можете сделать это в Java. Не без поддержки лямбды (не задерживай дыхание ...). Вы можете сделать это в Scala, например, используя ScalaTest. И, возможно, в некоторых других языках JVM.
В Java идиома состоит в том, чтобы обернуть эти функции анонимными классами, возможно, реализуя интерфейс, определяющий метод для запуска.

1 голос
/ 15 июня 2011

Одним из способов достижения этого является использование intefaces: -

  1. Измените метод runScenario(), чтобы он принимал этот интерфейс в качестве аргумента.
  2. Реализуйте интерфейс для каждого типа сценария и передайте тот, который вам нужен для тестирования сценария.

Как правило, модульное тестирование в Java выполняется с помощью jUnit , если вы уже не знали об этом. Есть много доступных учебных пособий, и один такой можно найти здесь .

...