Я знаю, что этот вопрос задавался несколько раз в 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, а в среде unit test создание сокетов, безусловно, не удастся.
Я могу изменить 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
}
В тесте overrode connectToHost и вернул макет.