Модульные тесты в Groovy для кода Java - как издеваться над классами Java? - PullRequest
1 голос
/ 10 марта 2011

Я представляю Groovy в большом проекте, написанном на Java, начиная (как это делают большинство парней) с написания модульного теста в Groovy для классов Java.

Итак, у меня проблема:

Представьте, что у меня есть 2 Java-класса, ClassA и ClassB, которые взаимодействуют следующим образом:

public class ClassA {
  public void doSomething(...) {

    ...//something

    ClassB.invokeSomeStaticMethod((someParam);

    ...//something

  }
}

ClassB - сервис, ищущий некоторые данные из базы данных.Я тестирую функциональность ClassA.Так что я хотел бы каким-то образом смоделировать ClassB, так что invokeSomeStaticMethod () в контексте моего модульного теста вернул бы проверенное значение для тестирования.Насколько я понимаю, основная проблема заключается в том, что оба класса являются Java, и, следовательно, метод ClassB.invoke ... не маршрутизируется через Groovy MOP, на котором основаны Groovy Mocks.Я прав?И как мне добиться того, что мне нужно?

Спасибо!Михаил

Ответы [ 3 ]

1 голос
/ 10 марта 2011

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

Решением является экстернализация вашей зависимости и удаление статического метода из ClassB

public class ClassA(ClassB classB)
{
    ClassB classB
    public void doSomething()
    {
         classB.invokeSomething();
    }
}

У этого подхода есть два преимущества:

  • ClassA не имеет более прочной связи с ClassB. Его можно заменить на подкласс или макет.
  • ClassA теперь объявляет о своей зависимости от ClassB, которую должен знать весь мир, вместо того, чтобы полагаться на ошибки времени выполнения, чтобы дать понять разработчикам, что что-то отсутствует.

Отличная статья Синглтоны - это лжецы (из блога Google Testing) отлично справляется с изучением этой концепции.

0 голосов
/ 10 марта 2011

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

Имитировать статический метод без параметров в Groovy

0 голосов
/ 10 марта 2011

AFAIK, Groovy MOP не сможет заменить вызов на ClassB.invokeSomeStaticMethod(someParam).Вы можете использовать фреймворк, такой как JMockit , чтобы помочь вам высмеивать статический метод.

...