Ich versuche zu lernen, testbaren Code in Java schreiben. Ich habe viele Links gesehen, die besagen, dass eine Singleton-Klasse nicht gut implementiert werden kann, wenn ich Komponententests durchführen möchte. Also hier ist, was ich versuche zu lösen. Ich habe eine Klasse, die HTTP-Anfragen (HTTPRequest-Klasse) sendet. Ich möchte, dass diese Klasse sich Gedanken darüber macht, welches Protokoll verwendet werden soll (TLSv1.2 usw.). Ich habe mehrere andere Klassen, die nur HTTPRequest Klasse mit Körper, URL, etc.Wie in Richtung Abhängigkeitsinjektion mit Singleton-Klasse
Die Art, wie ich es ankam, war, dass HTTPRequest eine Singleton-Klasse sein kann, da es nicht notwendig ist, mehrere Instanzen der gleichen Sache zu erstellen. Das Protokoll für das gesamte Projekt ist identisch und muss nur einmal festgelegt werden.
So sieht meine HTTPRequest aus.
public class HTTPRequest {
private CloseableHttpClient httpClient;
private HttpGet httpGet;
private HttpPut httpPut;
private HttpPost httpPost;
HTTPRequest(CloseableHttpClient a, HttpGet b, HttpPut c, HttpPost d) {
httpClient = a;
httpGet = b;
httpPut = c;
httpPost = d;
}
public HTTPResponse getRequest(url) {
//Do some processing with httpClient & httpGet to send the request
}
}
nun aus den Klassen, die Httprequest benötigen, ist es eine Möglichkeit, getRequest zu rufen, sondern nur ein Objekt mit? Ich habe etwas über die Abhängigkeitsinjektion gelesen, aber ich bin nicht wirklich in der Lage herauszufinden, wie ich es machen soll.
Wie soll ich den Code so ändern, dass er auch testbar ist?
class SomeOtherClass {
private HTTPRequest httpRequest;
public void setHttpRequest(HTTPRequest httpRequest){
}
public void someAction(){
httpRequest.getRequest(...);
}
}
...
SomeOtherClass someOtherClass = new SomeOtherClass(httpRequest);
In dem obigen Beispiel HttpRequest
(die Abhängigkeit) in SomeOtherClass
injiziert:
Warum übergeben Sie 'HttpGet',' HttpPut' usw. als Parameter im Konstruktor? – alayor
@alayor Ich möchte die Antworten für HttpGet verspotten. Da ich es eigentlich nicht meinen Server möchte. – user1692342
Aber könnten Sie 'HttpGet' in' getRequest' Methode übergeben? – alayor