Sto cercando di scrivere la mia prima libreria "reale".
Nel mio caso fornirà un'API java / kotlin per l'invio di chiamate di rete a un server.
Sono un grande fan di TDD e vorrei codificare la libreria allo stesso modo.
Normalmente ora separerei il codice di rete dall'altro codice per verificare se la classe di rete viene chiamata correttamente
public class SpecialServerClient {
private final HttpClient httpClient;
public SpecialServerClient(HttpClient httpClient){
this.httpClient = httpClient;
}
public void sendData(Data data){
//Do things with data
//Create request for data
//Pass request to httpClient
}
}
e il test
public class SpecialServerClientTest {
@Mock HttpClient httpClient;
private SpecialServerClient specialServerClient;
@Before
public void setUp(){
specialServerClient = new SpecialServerClient(httpClient)
}
@Test
public void testSendData(){
Data data = //Create fake data
specialServerClient.sendData(data);
verify(httpClient).calledWithRequestWithTransformedData()
}
}
Ma nel caso di una biblioteca non posso proprio farlo.
Non voglio sovraccaricare gli utenti dell'API per fornire un HttpClient anche se la libreria fornisce un'implementazione predefinita / reale per loro.
Ovviamente potrei creare un costruttore sovraccarico solo per il test:
public class SpecialServerClient {
private final HttpClient httpClient;
public SpecialServerClient(){
this.httpClient = RealHttpClient();
}
public SpecialServerClient(HttpClient httpClient){
this.httpClient = httpClient;
}
}
ma ora aggiungo il codice di produzione per motivi di testing,
che non è poi così grandioso.
C'è un modo migliore per risolvere questo?