2017-09-01 6 views
1

J'ai un collecteur de mesures qui stockent des données sur InfluxDB, je veux tester les méthodes pour stocker ces mesures. Je l'essaie mais je ne suis pas capable de se moquer du client InfluxDB. Je ne veux pas pointer vers un vrai InfluxDB sur l'environnement de test.Mock client InfluxDB pour tester une classe MetricCollector

Tout ce que j'ai réalisé jusqu'ici sont des "exceptions de pointeur nulles" et la conection refusée.

Ceci est mon test (en utilisant TestNG). Qu'est-ce que je fais mal?

@Test 
    public void validateMetrics() { 
     String influxHost = "http://localhost"; 
     String credentials = "admin:admin"; 
     String influxDatabaseName = "testDataBase"; 
     influxDB = InfluxDBFactory.connect(influxHost, credentials.split(":")[0], credentials.split(":")[1]); 

     MetricsCollector metricsCollector = null; 

     try { 
      String hostName = "test-server-01"; 
      int statusValue = 1; 
      metricsCollector = new MetricsCollector(influxDB); 


      BatchPoints metrics = metricsCollector.initBatchPoint(influxDatabaseName); 
      Point point = metricsCollector.setMetric(hostName, "status", statusValue); 
      metrics = metricsCollector.addToMetrics(metrics, point); 

      Assert.assertTrue(metrics.getPoints().get(0).lineProtocol().contains(hostName)); 
      Assert.assertTrue(metrics.getPoints().get(0).lineProtocol().contains("status=" + statusValue)); 
     } finally { 
      if (metricsCollector != null) { 
       metricsCollector.closeConnection(); 
      } 
     } 
    } 

Répondre

0

Je ne comprends absolument pas le fonctionnement de mockito. Voici mon code fixe:

@Mock private InfluxDB influxDB; 
    @Test 
    public void validateMetrics() { 
     MetricsCollector metricsCollector = null; 
     String influxHost = "http://localhost"; 
     String credentials = "admin:admin"; 
     String influxDatabaseName = "testDataBase"; 

     influxDB = InfluxDBFactory.connect(influxHost, credentials.split(":")[0], credentials.split(":")[1]); 

     try { 
      String hostName = "test-server-01"; 
      int statusValue = 1; 
      metricsCollector = new MetricsCollector(influxDB); 

      BatchPoints metrics = metricsCollector.initBatchPoint(influxDatabaseName); 
      Point point = metricsCollector.setMetric(hostName, "status", statusValue); 
      metrics = metricsCollector.addToMetrics(metrics, point); 

      Assert.assertTrue(metrics.getPoints().get(0).lineProtocol().contains(hostName)); 
      Assert.assertTrue(metrics.getPoints().get(0).lineProtocol().contains("status=" + statusValue)); 
     } finally { 
      if (metricsCollector != null) { 
       metricsCollector.closeConnection(); 
      } 
     } 
    } 

Yep, a ajouté que l'annotation simple "simulation" et tout fonctionne très bien.

1

Je soupçonne que la raison pour laquelle vous ne pouvez pas se moquer du client InfluxDB est qu'il est créé par une méthode statique: InfluxDBFactory.connect(). Pour se moquer de cela, vous aurez besoin de PowerMock.

Quelque chose comme ceci:

@PrepareForTest({InfluxDBFactory.class}) 
public class ATestClass { 

    @Test 
    public void validateMetrics() { 
     // this allows you to mock static methods on InfluxDBFactory 
     PowerMockito.mockStatic(InfluxDBFactory.class); 

     String influxHost = "http://localhost"; 
     String credentials = "admin:admin"; 
     String influxDatabaseName = "testDataBase"; 

     InfluxDB influxDB = Mockito.mock(InfluxDB.class); 

     // when the connect() method is invoked in your test run it will return a mocked InfluxDB rather than a _real_ InfluxDB 
     PowerMockito.when(InfluxDBFactory.connect(influxHost, credentials.split(":")[0], credentials.split(":")[1])).thenReturn(influxDB); 

     // you won't do this in your test, I've only included it here to show you that InfluxDBFactory.connect() returns the mocked instance of InfluxDB 
     InfluxDB actual = InfluxDBFactory.connect(influxHost, credentials.split(":")[0], credentials.split(":")[1]); 
     Assert.assertSame(influxDB, actual); 

     // the rest of your test 
     // ... 
    } 
} 

Note: il y a des exigences spécifiques de compatibilité pour TestNG, Mockito et PowerMock décrit here et here.

+0

Votre code ne fonctionne pas pour moi, mais vous me mettez dans la bonne direction. Je vais modifier la question et ajouter la solution. Merci – FranAguiar