2012-06-05 4 views
4

Я хочу, чтобы модуль тестировал класс, Class A, но он имеет зависимость от другого класса, который использует метод user session. Метод, который я хочу проверить, не включает user session. Могу ли я создать вспомогательный метод в Class A, который бы реплицировал поведение метода Class B, который мне нужен?Наличие вспомогательных методов в классе junit

Я знаю, что это не понятно, давайте копать код, чтобы получить четкое понимание ....

public void testDetails() throws Exception 
{ 
    //Some logic that generates DetailsTOList 
    saveDetailsHelper(DetailsTOList); 
    int detailsSize = getDetailsSize(); 
    assertNotNull(detailsSize); 
} 

Теперь getDetailsSize() прибудет информацию о размере из базы данных. Class B имеет этот метод, но я не могу создать объект Class B и протестировать этот метод, так как Class B получает информацию о сеансе от пользователя, и я могу установить информацию о сеансе из класса JUnit.

Я создал saveDetailsHelper метод, который повторяет поведение Class B - saveDetails() метода, и звонит, что в testDetails() способе, как показано выше.

Мой вопрос:

  1. мы можем иметь вспомогательные методы в junit class?
  2. Что такое лучший подход для решения этой проблемы?
+3

Если вы не можете или не хотите использовать настоящие функциональные возможности класса B в своих тестах, но хотите иметь «как было бы работать» - взгляните на [Концепция Mocking] (http: //www.michaelminella.com/testing/the-concept-of-mocking.html) - это может быть то, что вы ищете – Laimoncijus

+0

+1 для использования mocks. Именно по этой причине mocks были _invented._ –

ответ

3

Классы JUnit функционируют подобно любому другому классу в java; вы можете иметь вспомогательные функции. Единственное, что определяет, будут ли выполняться другие функции (в зависимости от версии junit), есть или нет аннотация, указывающая, что жгут для запуска его в качестве теста.

Однако, именно поэтому вы должны тщательно спланировать свои занятия. Если Class B обращается к базе данных за информацией, это отличная возможность разделить эту функциональность. Вы не уточняете «зависимость» (расширяете ли вы?), Но если Class B является компонентом класса A, вы можете создать целый класс-заглушку, который является подставкой для Class B, и возвращает жестко закодированные (или иначе закодированные) данные конкретно для тестирования класса A. До тех пор, пока подпись прокси Class B будет одинаковой, вы можете быть уверены в том, что работает класс A.

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

public class testA { 

    @Test 
    public void testDetails { 
    ClassA a = new ClassA(); 
    a.setDependency(new StubClassB()); 
    //run your test 
    } 


    private class StubClassB() extends ClassB { 
    public boolean saveDetails() { 
     //return fake information; 
    } 
    } 
} 
+1

Ваша проза немного смешана. Вы должны попытаться использовать более короткие предложения.Короткие предложения облегчают читателю знать, где они вас потеряют. Кроме того, это может помочь, если вы на самом деле даете имена методам, которые вы обсуждаете. Это облегчает вам следовать вашей логике. Наконец, основная идея состоит в том, чтобы создать класс, который действует как B, чтобы действовать для введенного тестового ввода и использовать его для тестирования A. Однако ему не нужно функционировать точно так же, как это делает B: он может отпугивать назад глупые ответы. Он просто должен выглядеть как B, насколько это касается A. –

+0

Я не расширяю класс B классом A. Из класса B я вызываю метод класса A и передаю некоторые аргументы этому методу. Эти аргументы вычисляются методами, представленными в классе B. В моем модульном тесте я не могу ссылаться на класс B и вызывать эти методы как пользовательский сеанс класса B. Несмотря на то, что эти методы не относятся к пользовательскому сеансу, я не могу использовать их, поскольку я не могу создавать объекты класса B. Итак, я просто воспроизвел это поведение в вспомогательных методах в своем модульном тестовом классе, надеюсь, что это уточнит (Изменено так, что это больше читаемый ...) – Rachel

+0

Можете ли вы создать класс, который расширяет B и переопределяет методы, которые вам нужны из класса B? Или это строительство класса B? –

1

Вспомогательные методы не будут содержать аннотацию @Testcase. Вы должны написать тестовый код так же, как и любой другой код, но должны включать только соответствующие методы тестирования и проверять только соответствующие части этого метода тестирования.

+0

вы имеете в виду '@ Test' аннотацию право? – Rachel

1

Вы можете поставить вспомогательный метод в тестовом классе, опустить аннотацию TestCase и вызвать его в случае необходимости (специальная по методу или в установке, если это необходимо для всех тестов). Но, вероятно, лучшим решением является использование чего-то типа JMock для представления класса B и возврата желаемых результатов.

Смежные вопросы