Как статический метод может вернуть другой класс реализации? - PullRequest
1 голос
/ 11 января 2010

Я пишу модульный тест, отключив внешние службы

com.example.Service service;

service = RealServiceClient.getService().getServiceId("1");

Как мне смоделировать класс RealService выше?

Дело в том, RealServiceClient.getService() возвращает RealService.

PS: я новичок в Java.

Ответы [ 4 ]

1 голос
/ 11 января 2010

Существует довольно много вариантов создания фиктивного Сервиса для юнит-теста. Большинство из них имеют «макет» в названии и являются основой для подобных вещей. Вот несколько инструментов на основе Java:

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

Лично я предпочитаю использовать динамический язык для выполнения макетов. Я считаю, что вы можете получить массу необходимых вам навыков без причудливой основы. Я часто использую groovy для написания своих модульных тестов. Смотрите эту страницу для получения дополнительной информации об использовании Groovy-замыканий вместо Mocks: http://groovy.codehaus.org/Developer+Testing+using+Closures+instead+of+Mocks

1 голос
/ 11 января 2010

В дополнение к другим насмешливым фреймворкам я рекомендую Mockito . Это потрясающе. Как новичку в Java, потребуется некоторое время, чтобы пройти учебники, но это будет стоить усилий.

Однако, как указывает Паскаль, Mockito не может высмеивать статические методы . Это серьезное ограничение для приведенного вами примера.

1 голос
/ 11 января 2010

Это просто. Не используйте синглтоны или другие изменяемые статики. Передайте свой сервис (или способ получить его) через конструктор, то есть «Параметр сверху».

0 голосов
/ 11 января 2010

Если это возможно, сделайте код более тестируемым, как предложено Томом Хоутином. Разработка кода для тестируемости на самом деле является хорошей практикой, так что это была бы хорошая идея. Несколько советов: устраните статические методы (таким образом избегайте одиночных), предоставьте сеттеры или конструкторы, позволяющие вводить зависимости.

Если это не так (например, это устаревший код, который вы не можете изменить), используйте макет , позволяющий имитировать статические методы . Я думаю о JMockit или Powermock (позднее расширяются EasyMock и Mockito и предоставляется возможность макет статических методов ). Я недавно экспериментировал с Powermock, и мне было очень весело с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...