Search code examples
javamockitotestnginfluxdb

Mock InfluxDB client to test a MetricCollector class


I have a metrics collector that store data on InfluxDB, I want to test the methods to store that metrics. I'm trying it but I'm not able to mock the InfluxDB client. I don't want to point to a real InfluxDB on the test environment.

Everything I've achieved so far are some "null pointer exceptions" and conection refused.

This is my test (using TestNG). What am I doing wrong?

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

Solution

  • I totally misunderstanding how mockito works. Here is my fixed code:

        @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, added that simple "mock" annotation and all works fine.