Dato il seguente codice:
class ClientClass{
public function print(){
//some code to calculate $inputString
$parser= new Parser($inputString);
$result= $parser->parse();
}
}
class Parser{
private $inputString;
public __construct($inputString){
$this->inputString=$inputString;
}
public function parse(){
//some code
}
}
Ora ClientClass
ha dipendenza dalla classe Parser
. Tuttavia, se volessi utilizzare Dipendenza dell'iniezione per il test delle unità, ciò causerebbe un problema perché ora non posso inviare l'input stringa al costruttore di parser come prima come calcolata all'interno di ClientCalss
stesso:
class ClientClass{
private $parser;
public __construct(Parser $parser){
$this->parser=$parser;
}
public function print(){
//some code to calculate $inputString
$result= $this->parser->parse(); //--> will throw an exception since no string was provided
}
}
L'unica soluzione che ho trovato è stata la modifica di tutte le mie classi che hanno utilizzato parametri nei loro costruttori per utilizzare invece Setters (esempio: setInputString()
).
Tuttavia, penso che potrebbe esserci una soluzione migliore di questa, perché a volte modificare le classi esistenti può causare molto più danni che benefici.
- Le classi iniettabili non sono autorizzate ad avere parametri di input?
- Se una classe deve prendere parametri di input nel suo costruttore, quale sarebbe il modo di iniettarla correttamente?
Aggiorna
Solo per chiarimenti, il problema si verifica quando nel mio codice di produzione decido di farlo:
$clientClass= new ClientClass(new Parser($inputString));//--->I have no way to predict $inputString as it is calculated inside 'ClientClass' itself.
UPDATE 2
Sempre per chiarimenti, sto cercando di trovare una soluzione generale al problema non per questo codice di esempio solo perché alcune delle mie classi hanno 2, 3 o 4 parametri nei loro costruttori, non solo uno.