2015-11-24 10 views
0

Ниже приведен метод, который я хочу проверить. Я использую платформу TestNG для модульного тестирования.Отказывание статического метода

class Random{ 

    List<String> namesOfLinks; 

    public List<String> methodIwantToTest(List<String> cktNames) { 
      Map<String, Graph> maps = DataBaseReader.getGraphs(cktNames); 
      for (Entry<String, Graph> entry : maps.entrySet()) { 
       graphList.add(entry.getValue().getName()); 
      } 
    } 

    return namesOfLinks; 
} 

Я пишу контрольные примеры для метода «methodIwantToTest» в вышеприведенном классе. Я могу предоставить некоторые фиктивные имена cktNames и получить метод для выполнения, как показано ниже.

@Test (dataProvider = "dp") 
public void test_methodIwantToTest(List<String> cktNames, List<String> expectedLinkNames){ 
    Random rm = new Random(); 
    List<String> actual = rm.methodIwantToTest(cktNames); 
    Assert.assertEquals(actual,expectedLinkNames); 
} 

Теперь возникает проблема. Когда фактический метод выполняется, когда я вызываю его на ссылку «rm», он имеет вызов статического метода другому API. Он должен что-то вернуть, чтобы мой «метод» работал. Я обыскал интернет и нашел «easymock» в качестве решения. Но я не могу использовать «easyMock», чтобы издеваться над статическим методом (DataBaseReader.getGraphs()). Я должен издеваться над этим методом, чтобы он возвращал карту определенного типа. Любые предложения были бы замечательными. Спасибо!

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

+1

Вы не можете издеваться над статическим методом, используя также easymock. Вам нужно использовать powerMock. – proudandhonour

ответ

1

Я бы рекомендовал использовать шаблон адаптера в сочетании с технологией Injection Dependency. Создайте интерфейс, который содержит все методы, которые вы хотите, чтобы дразнить:

public interface IDatabase { 
    Map<String, Graph> getGraphs(List<String> names); 
} 

Очевидно, Database не реализует интерфейс, который вы только что изобрели (и метод static в любом случае), но вы можете создать класс адаптера:

public class DataBaseReaderAdapter implements IDatabase { 
    public Map<String, Graph> getGraphs(List<String> names) { 
     return DataBaseReader.getGraphs(names); 
    } 
} 

Возьмите экземпляр этого класса в качестве параметра конструктора в классе вы хотите проверить:

public class Random { 
    private readonly IDatabase _database; 

    public Random(IDatabase database) { 
     _database = database; 
    } 
} 

и когда вы Wa нт для вызова метода:

Map<String, Graph> maps = _database.getGraphs(cktNames); 

В тесте, использовать любые насмешливые рамки, чтобы создать макет из IDatabase, и передать этот макет в Random.

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