Emmanuel Donald
Emmanuel Donald

Reputation: 99

Using jBehave with Mockito gives null pointer exception

Using jBehave with Mockito gives null pointer exception

Console Output: Example: {ename=Tom Brown, id=1, dept=Dept 1} Given a new Employee record When the Employee name is Tom Brown When the Employee id is 1 When the Employee dept is Dept 1 When the method is POST Then the returned values should match (FAILED) (java.lang.NullPointerException: Cannot invoke "org.springframework.test.web.servlet.MockMvc.perform(org.springframework.test.web.servlet.RequestBuilder)" because "this.mockMvc" is null)

Code in GitHub as Maven Project

EmployeeControllerTest.java

package com.donemm.simpc;
<imports>
public class EmployeeControllerTest extends JUnitStory {
@Override
public Configuration configuration() {
   return new MostUsefulConfiguration()
         .useStoryLoader(new LoadFromClasspath(this.getClass()))
         .useStoryReporterBuilder(new StoryReporterBuilder().
             withDefaultFormats().withFormats(Format.CONSOLE, Format.TXT, Format.HTML));
}
@Override
public InjectableStepsFactory stepsFactory() {
    return new InstanceStepsFactory(configuration(), new EmployeeControllerSteps());
}
}

EmployeeControllerSteps.java

package com.donemm.simpc;

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import com.donemm.simpc.entity.Employee;
import com.donemm.simpc.repository.EmployeeRepository;
import com.donemm.simpc.services.EmployeeService;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.donemm.simpc.controller.EmployeeController;

import static org.hamcrest.CoreMatchers.is;

import static org.mockito.ArgumentMatchers.*;
import static org.mockito.BDDMockito.*;
import static org.mockito.Mockito.when;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;

import org.jbehave.core.annotations.Given;
import org.jbehave.core.annotations.Named;
import org.jbehave.core.annotations.Then;
import org.jbehave.core.annotations.When;

@WebMvcTest(controllers = EmployeeController.class)
@AutoConfigureMockMvc
public class EmployeeControllerSteps {
    
    @Autowired
    private MockMvc mockMvc;
    
    @InjectMocks private EmployeeService employeeService;
    @Mock private EmployeeRepository employeeRepository;
 
    private Employee employee;
    
    @Given(value="a new Employee record", priority=11)
    public void createEmployee() {
        this.employee = new Employee();
    }
    
    
    @When(value="the Employee name is <ename>", priority=10)
    public void setEname(@Named("ename") String ename) {
        this.employee.setEname(ename);
    }
    
    @When(value="the Employee id is <id>", priority=9)
    public void setId(@Named("id") int id) {
       this.employee.setId(id); 
    }
    
    @When(value="the Employee dept is <dept>", priority=6)
    public void setDept(@Named("dept") String dname) {
        this.employee.setDept(dname);
    }
    
    @When(value="the method is POST", priority=5)
    public void methodIsGet() {
        
    }

    @Then(value="the returned values should match", priority=4)
    public void checkValues() throws Exception {
    
        MockitoAnnotations.initMocks(this);
        
        when(employeeRepository.save(any(Employee.class))).thenReturn(this.employee);
        
        ObjectMapper objectMapper = new ObjectMapper();
            
        ResultActions response = this.mockMvc.perform(post("http://localhost:8080/employees")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(this.employee)));
        
        response.andDo(print()).
        andExpect(status().isCreated())
        .andExpect(jsonPath("$.ename",
                is(this.employee.getEname())))
        .andExpect(jsonPath("$.dname",
                is(this.employee.getDept())));
        
    }
}

Eclipse Project Explorer

Upvotes: 0

Views: 194

Answers (0)

Related Questions