2016-08-03 37 views
0

Ich werde eine Methode erstellen, die große ArrayList analysieren wird. und ich möchte Testmethode in JUnit schreiben. Die Größe von ArrayList könnte bis zu zwei Millionen erreichen. Ich denke, dass es keine gute Idee ist, sich mit der Datenbank zu verbinden und Daten von dort zur Analyse zu bekommen, da ein Test kein Komponententest ist, wenn er mit der Datenbank spricht. Wie soll ich mich in dieser Situation verhalten? Oder wie groß werden Daten im Allgemeinen durch Unit-Tests analysiert?Wie man große ArrayList von Mockito verspotten?

Beispiel:

public void analyze(List<Double> list) { 

    double n1, n2, n3; 

    for (int i = 3; i < list.size(); i += 3) { 

     n1 = list.get(i - 3); 
     n2 = list.get(i - 2); 
     n3 = list.get(i - 1); 

     if (/* Some condition here using n1, n2, n3*/) { 
      list.remove(i); 
     } 
    } 
} 

@Test 
public void analyzeTest() { 

    List<Double> list = new ArrayList<Double>(); 

    // To add 1M data here. 

    analyze(list); 

    assertEquals(list, expected); 

} 
+0

Bitte Kommentar hinterlassen, wenn Sie negativ wählen. – Vanguard

+0

Warum brauchst du überhaupt einen Spott? Es sollte in Ordnung sein, einfach eine normale 'ArrayList' zu erstellen und sie während der Testeinrichtung manuell mit einer Million Einträge zu füllen. –

+0

@DanielPryden Ich wollte nur meinen Komponententest von der Datenbank isolieren. und ich wollte nur sicher sein, ob es richtig ist, in diesem Fall eine Verbindung zur Datenbank herzustellen oder keine Verbindung herzustellen. – Vanguard

Antwort

2

ein Test nicht ein Unit Test, wenn es mit der Datenbank spricht

Sie haben Recht.

Also, wie soll ich in dieser Situation richtig handeln?

Erstellen Sie ein Objekt ArrayList und füllen Sie es mit Daten. Testen Sie dann anhand dieser Daten, dass sich Ihr Produktionscode wie gewünscht verhält. Sie brauchen nicht Millionen von Einträgen, nur das Minimum, um die verschiedenen Fälle von analyze() zu decken.

Wie werden große Daten im Allgemeinen durch Komponententests analysiert?

Eine gute Praxis ist mehrere Ebenen von Test zu haben:

  1. Unit-Tests - überprüft die Logik des Codes, ohne externe Ressourcen wie Datenbank.
  2. Integrationstest - überprüft, ob verschiedene Teile Ihres Systems (z. B. Datenbank, Webserver, API usw.) korrekt miteinander interagieren.
  3. Leistungstests - überprüft, wie sich Ihr System unter Stress oder mit großen Datenmengen verhält. Dafür gibt es spezielle Tools (jMeter, Gatling).
-2

Hallo Sie wie folgt verwenden können: fleResult ist Ihre Datenbank oder Service-Objekt, das das Ergebnis zurückgibt.

@Test 
public void testGetLogEvents(@Mocked final LogRecProcess fleResult, 

Und diese Klasse als Methode param verspottet und @RunWith (JMockit.class) in der Klasse zu testen, fügen Sie die Erwartungen und das Rück Ihre Beispieldaten als Array

new Expectations() { 
     { 
      fleResult.getEvents(); 
      result = Arrays.asList(new FilteredLogEvent[] { evnt }); 
     } 
    }; 
+1

Tippfehler, nicht kompilierbarer Code, einige Zeichen von JMock und keine Anzeichen von Mockito, nach denen OP gefragt hat. Diese Antwort scheint überhaupt nicht nützlich zu sein. –

+0

Ich habe die Antwort nicht vollständigen Code gegeben. Es gibt keinen Code in Frage, um es zu beheben. Tippfehler kann jemand beheben. Wie sagt man das ist überhaupt nicht nützlich? Irgendein anderer Grund als Tippfehler? – Anand