Spring boot - Null pointer exception while mocking MongoTemplate.getCollection()

Viewed 23

I have written a service class which uses MongoTemplate.getCollection(). But while writing the test case I am mockingMongoTempalte and MongoCollection but getting NullPointerException. Following is the code.

Service class

import com.mongodb.client.MongoCollection;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.NoSuchElementException;


@Service
public class ABCService {

    @Autowired
    MongoTemplate mongoTemplate;

    public byte[] exportFrom(String collectionName) {
        if(!mongoTemplate.collectionExists(collectionName))
            throw new NoSuchElementException("Collection does not exist");
        MongoCollection<Document> collection = mongoTemplate.getCollection(collectionName);
        do something
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Test Class:

import com.mongodb.BasicDBObject;
import com.mongodb.client.MongoCollection;
import org.bson.Document;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.mongodb.core.MongoTemplate;

import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
class ABCServiceTest {

    @Mock
    private MongoTemplate mongoTemplate;

    @Mock
    private MongoCollection<Document> documentMongoDBCollection;

    @InjectMocks
    private ABCService abcService ;
    
    @Test
    void exportFrom() throws Exception {
        JSONObject obj = new JSONObject();
        obj.put("_id", "1234");
        obj.put("accessField", "xyz 123");
        Document doc = Document.parse(obj.toString());
        byte[] pos = obj.toString().getBytes();
        when(mongoTemplate.collectionExists("DataCollection"))
                .thenReturn(true);
        when(mongoTemplate.getCollection(any(String.class)))
                .thenReturn(documentMongoDBCollection); // **This returning Null pointer exception**
        when(abcService .exportFrom("DataCollection"))
                .thenReturn(pos);
        byte[] result = abcService .exportFrom("DataCollection");
        Assertions.assertNotNull(result);
        verify(mongoTemplate,times(1)).collectionExists("DataCollection");
        verify(mongoTemplate,times(1)).getCollection("DataCollection");
    }
}

Expecting to throw object to complete the mocking of Mongo template.

0 Answers
Related