Заводской шаблон проектирования - не использовать статические методы, потому что модульное тестирование является проблемой

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

public class ConnectionFactory
{
     public static Connection createConnection(ConnectionType connectionType, String ipAddr, Integer port)
    {
           //Some error checking
         switch(connectionType)
         {   
             case TCP:
                  return createTcpConnection(ipAddr, port);
             case UDP:
                  return createUdpConnection(ipAddr, port);
             case RTP:
                  return createRtpConnection(ipAddr, port);
             case SCTP:
                  return createRtpConnection(ipAddr, port);
             default:
                  break;
         }
    }

    // TcpConnection, RtpConnection, SctpConnection and UdpConnection implement interface Connection
    public Connection createTcpConnection()
    {
        Connection connection = new TcpConnection();
         .....
         .....
         return connection;
    }

    public Connection createUdpConnection()
    {
        Connection connection = new UdpConnection();
        .....
        .....
        return connection;
    }

    ....
    ....
}

И предположим, что если у меня есть CommunicationService, подобный приведенному ниже

public class CommunicationService
{
    public void initConnectionPool(ConnectionType connectionType)
    {
        for(int i = 0; i < MAX_CONNECTIONS; i++)
             connectionList.add(ConnectionFactory.createConnection(connectionType, "domain.com", 40203));

        //Some more code here to do further processing
          ......
          ......
    }    

    //Some more methods
}

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

Я хочу протестировать метод initConnectionPool, и в среде модульного тестирования создание сокета определенно завершится ошибкой.

Я могу изменить ConnectionFactory на конкретный класс и смоделировать его. Но разве это не хорошая ситуация для создания класса со статическими методами? Я не пытаюсь поддерживать какое-либо состояние в ConnectionFactory. Итак, если использование статических методов там, где это может быть целесообразно, может вызвать проблемы с тестированием, когда мы используем статические методы? Или здесь неуместно использовать статические методы?

РЕДАКТИРОВАТЬ: Решение, которое я использовал

public class CommunicationService
{
    public void initConnectionPool(ConnectionType connectionType)
    {
        for(int i = 0; i < MAX_CONNECTIONS; i++)
             connectionList.add(connectToHost(connectionType));

        //Some more code here to do further processing
          ......
          ......
    }    

    public Connection connectToHost(ConnectionType connectionType)
    {
        ConnectionFactory.createConnection(connectionType, "domain.com", 40203)
    }
    //Some more methods
}

В тесте переопределил connectToHost и вернул имитацию.

15
задан Prasanna 7 July 2011 в 18:35
поделиться