J.Olufsen
J.Olufsen

Reputation: 13915

Cannot inject service into Spring test

financialReportService is null in REST controller that denotes it fails to inject.

Test:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SnapshotfindocApp.class)
public class FindocResourceIntTest {
@Inject
    private FinancialReportService financialReportService; 
@Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        FindocResource findocResource = new FindocResource();
        ReflectionTestUtils.setField(findocResource, "findocRepository", findocRepository);
        this.restFindocMockMvc = MockMvcBuilders.standaloneSetup(findocResource)
            .setCustomArgumentResolvers(pageableArgumentResolver)
            .setMessageConverters(jacksonMessageConverter).build();
    }


@Test
    @Transactional
    public void getFinancialRecords() throws Exception {

        // Get all the financial-reports
        restFindocMockMvc.perform(get("/api/financial-reports"))
            .andExpect(status().isOk());
        List<Findoc> finReports = financialReportService.getFinancialReports();
        for (Findoc fr : finReports) {
            assertThat(fr.getNo_months()).isBetween(12, 18);
            LocalDate documentTimeSpanLimit = LocalDate.now().minusMonths(18);
            assertThat(fr.getFinancial_date()).isAfterOrEqualTo(documentTimeSpanLimit);
        }
    }

The service:

@Service
@Transactional
public class FinancialReportService {

    private final Logger log = LoggerFactory.getLogger(FinancialReportService.class);

    @Inject
    private FinancialReportDAO financialReportDAO;

    public List<Findoc> getFinancialReports(){
        return financialReportDAO.getFinancialReports();
    }

}

Controller:

@GetMapping("/financial-reports")
    @Timed
    public List<Findoc> getFinancialReports() {
        log.debug("REST request to get financial records");
        return financialReportService.getFinancialReports(); // financialReportService is null
    }

Update:

The application is generated by JHipster. Then the new service and DAO files were added to enable custom database queries to H2.

Upvotes: 1

Views: 433

Answers (1)

Jon Ruddell
Jon Ruddell

Reputation: 6362

After @Injecting the service, you also need to set the field in the setup() method. Adding the below line should solve your problem

ReflectionTestUtils.setField(findocResource, "financialReportService", financialReportService);

On a separate note, the following part of the test looks weird. You are fetching the financial reports twice. This file is the FindocResourceIntTest, so I would remove any direct calls to financialReportService.

    // Get all the financial-reports
    restFindocMockMvc.perform(get("/api/financial-reports"))
        .andExpect(status().isOk());
    List<Findoc> finReports = financialReportService.getFinancialReports();

Upvotes: 1

Related Questions