Я знаю, что этот вопрос задавался несколько раз в 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 и вернул имитацию.