2017-09-01 2 views
1

私はInfluxDBにデータを格納するメトリックコレクタを持っています。そのメトリックを格納するメソッドをテストしたいと思います。私はそれを試していますが、私はInfluxDBクライアントを嘲笑することができません。私はテスト環境で実際のInfluxDBを指摘したくありません。Mock InfluxDBクライアントがMetricCollectorクラスをテストする

私がこれまで達成したことは、いくつかの「ヌルポインタ例外」であり、接続は拒否されました。

これは私のテストです(TestNGを使用しています)。私は間違って何をしていますか? InfluxDBFactory.connect()

@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(); 
      } 
     } 
    } 

答えて

0

mockitoの仕組みを誤解しています。ここに私の固定コードは次のとおりです:

@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(); 
      } 
     } 
    } 

いいえ、単純な "モック"注釈を加えて、すべて正常に動作します。

1

は、私はあなたがInfluxDBクライアントを模擬することができない理由は、それが静的メソッドによって作成されていることであると思います。これを模擬するにはPowerMockが必要です。このような

何か:

@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 
     // ... 
    } 
} 

注:TestNGの、MockitoとPowerMockのための具体的な互換性の要件があるherehereを説明しました。

+0

あなたのコードは私のためには機能しませんが、私を正しい方法で入れてください。質問を編集して解決策を追加します。ありがとう – FranAguiar

関連する問題