Sto tentando di progettare una classe che deve essere istanziata attraverso l'uso di un metodo statico, qualcosa come newInstance(param1, param2)
. La ragione di questo è che 2 dei 4 parametri necessari provengono dallo stesso pacchetto, ma voglio nasconderli dal pubblico .
Per raggiungere questo obiettivo, ho reso privato il costruttore. Tuttavia, mi rendo conto che ora non riesco a passare i 2 parametri sui miei test.
Va così
class Foo {
private constructor(p1, p2, p3, p4) {}
public static newInstance(p1, p2) {
p3 = new p3;
p4 = new p4;
return new static(p1, p2, p3, p4);
}
}
Ovviamente il mio design è sbagliato, ma non riesco a pensare ad un modo per astrarre l'esistenza di p3 e p4 ad altri sviluppatori, pur continuando a passarli come dipendenza per applicare l'inversione di dipendenza.
Quale design posso utilizzare per raggiungere questo obiettivo? Forse dovrei semplicemente creare un FooFactory
e documentare che dovrebbero utilizzarlo ...
Sto praticamente scrivendo un SDK per un'API REST. Queste API REST non sono progettate da me né dalla mia azienda (quindi non posso rendere l'API REST conforme agli standard del settore) e ha un meccanismo di autenticazione molto complicato. È abbastanza complicato che voglio ottenere quanto segue:
- Scomposizione in piccoli componenti testabili, in modo che sia più semplice da gestire, e gli altri sviluppatori sono in grado di lavorare solo con gli endpoint esposti dall'SDK, che incapsulano il modello di dominio.
- Riassunto la costruzione del grafico delle dipendenze per l'SDK, in modo che possano semplicemente utilizzare la classe
CompanyClient
e chiamare metodi del dominio aziendale comegetCustomerList
. - Estrarre completamente la costruzione delle intestazioni, parametri, ecc. personalizzati della richiesta HTTP.
Sono d'accordo che questo lavoro sia una unità, quindi ha senso solo testare la classe CompanyAPI
da sola; Tuttavia, ciò renderebbe difficile mantenere i sottomeccanismi necessari per farlo funzionare.
In sintesi, suddividendolo in parti più piccole, è facile verificare che ogni meccanismo funzioni secondo le specifiche.
Per questo motivo voglio solo esporre 2 parametri per gli utenti della biblioteca. Non hanno bisogno di conoscere l'implementazione sottostante. Tuttavia, ho bisogno di testare e dato che le dipendenze includono un client HTTP, ho bisogno di iniettare oggetti finti.