тестирование пружинного контроллера сервисом - PullRequest
0 голосов
/ 24 декабря 2018

Испытание Love Spring еще больше с помощью Mocking и Unit Test Assistant:

Смежный сервис заменяет несколько зависимостей

введите описание изображения здесь

@Controller
@RequestMapping("/people")
public class PeopleController {
    @Autowired
    protected PersonService personService;
    @GetMapping
    public ModelAndView people(Model model) {
        for (Person person: personService.getAllPeople()) {
            model.addAttribute(person.getName(), person.getAge());
        }
        return new ModelAndView("people.jsp", model.asMap());
    }
}

private MockMvc mockMvc:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class PeopleControllerTest {
    @Autowired
    PersonService personService;

    private MockMvc mockMvc;

    @Configuration
    static class Config {
        // Other beans
        @Bean
        public PersonService getPersonService() {
            return mock(PersonService.class);
        }
    }
    @Test
    public void testPeople() throws Exception {
        // When
        ResultActions actions = mockMvc.perform(get("/people"));
    }
}

Я получаю ошибку, когда хочу запустить mockMvc

java.lang.NullPointerException

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Это потому, что вы никогда не инициализируете mockMvc в своем коде, а точка доступа к нему приводит к nullPointerException.Вам нужно инициализировать его перед его использованием, и поскольку его могут использовать несколько тестов в вашем классе, лучше всего это сделать setup() методом, аннотированным @before.Попробуйте ниже:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class PeopleControllerTest {
@Autowired
PersonService personService;

@Autowired
private WebApplicationContext wac;

private MockMvc mockMvc;

@Before
public void setup() {
  mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();


@Configuration
static class Config {
    // Other beans
    @Bean
    public PersonService getPersonService() {
        return mock(PersonService.class);
    }
}
@Test
public void testPeople() throws Exception {
    // When
    ResultActions actions = mockMvc.perform(get("/people"));
}
}
0 голосов
/ 24 декабря 2018

Выполните следующие шаги:

  1. создайте макет сервиса вместо оригинала сервиса ("PersonServiceMock")

  2. замените оригинал сервиса на макет сервиса

        @Autowired
        PersonService personService;
    
        @Autowired
        PeopleController peopleController;
    
        private MockMvc mockMvc;
    
        @Before
        public void setup() {
        peopleController = new PeopleController(new personServiceMock());
        mvc = MockMvcBuilders.standaloneSetup(peopleController).build();
       }    
    
        @Configuration
        static class Config {
            // Other beans
            @Bean
            public PersonService getPersonService() {
                return mock(PersonService.class);
            }
        }
        @Test
        public void testPeople() throws Exception {
            // When
            ResultActions actions = mockMvc.perform(get("/people"));
        }
    }
    
0 голосов
/ 24 декабря 2018

из исходного кода я вижу, что mockMvc не имеет никакого значения, поэтому он вызывает «java.lang.NullPointerException» для этой строки кода:

ResultActions actions = mockMvc.perform(get("/people"));

, чтобы запустить его,Я думаю, что сначала нужно придать значение mockMvc.
по конструктору:

@Test
public void testPeople() throws Exception {
    mockMvc = new MockMvc();
    // When
    ResultActions actions = mockMvc.perform(get("/people"));
}

или Autowired:

@Autowired
MockMvc mockMvc

зависит от назначения класса MockMvc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...