-1

I want to implement JUUNit test for this Spring Service:

        @Service
        public class BinCountryCheckFilterImpl {

            @Autowired
            @Qualifier("riskFilterService")
            private RiskFilterService riskFilterService;

            @Autowired
            @Qualifier("binlistsService")
            private BinlistsService binlistsService;

            public BinCountryCheckFilterImpl() {        
            }

            public PaymentResponse validateBinCountryCheckFilter(Merchants merchant, Contracts contract, Terminals terminal,
                      PaymentTransaction message, HttpServletRequest request) throws JAXBException, JsonProcessingException {

                     List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(terminal.getId(), "BinCountryCheckFilter");

                     Optional<BinLists> db_bin_list = binlistsService.findByName(billing_address_country);
             }
       }

I tried this JUnit test:

public class BinCountryCheckFilterImplTest {

    @InjectMocks
    private BinCountryCheckFilter binCountryCheckFilter;

    private BinlistsService binlistsService = Mockito.mock(BinlistsService.class);  
    private RiskFilterService riskFilterService = Mockito.mock(RiskFilterService.class);

    @Mock
    List<RiskFilters> riskFiltersList = null;

    Optional<BinLists> binList = null;

    @BeforeEach
    public void beforeEachTest() throws IOException {

        MockitoAnnotations.initMocks(this);             
        riskFiltersList = new ArrayList<RiskFilters>(); 

        RiskFilters filter = new RiskFilters();
        riskFiltersList.add(filter);    

        BinLists binLists = new BinLists();
        binList = Optional.of(binLists);
    }

    @Test
    public void testBinCountryCheckFilterImpl() throws JsonProcessingException, JAXBException {

        when(riskFilterService.findRiskFiltersByTerminalIdAndType(anyInt(), anyString())).thenReturn(riskFiltersList);
        when(binlistsService.findByName(anyString())).thenReturn(binList);

        List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(11, "BinCountryCheckFilter");

        Optional<BinLists> bin = binlistsService.findByName("US");

        BinCountryCheckFilterImpl binCountryCheckFilterImpl = new BinCountryCheckFilterImpl();

        binCountryCheckFilterImpl.validateBinCountryCheckFilter(merchant, contract, terminal, authorizeTransactiontMockup(), request);
    }

The code is working fine when I try to mock the requests with when..... but it fails when I call the actual Spring Service in order to test it with NPE at this line at the Service Java Class BinCountryCheckFilterImpl:

List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(terminal.getId(), "BinCountryCheckFilter");

How I can mock this SQL query?

Vinay Prajapati
  • 7,199
  • 9
  • 45
  • 86
Peter Penzov
  • 1,126
  • 134
  • 430
  • 808

1 Answers1

0

I assume that the riskFilterService is an interface and/or spring repository.

Can you try mock like:

doReturn(riskFiltersList).when(riskFilterService).findRiskFiltersByTerminalIdAndType(any(), any()));

This (doReturn/when) pretty much avoids calling the method than compared to when/return

https://stackoverflow.com/a/29394497/2931410

Karthik R
  • 5,523
  • 2
  • 18
  • 30