Исключение SpringBoot Nullpointer во время тестирования API - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь написать тесты для моего контроллера покоя и получаю NullPointerException всякий раз, когда пытаюсь выполнить действия с экземпляром MockMvc.

Мой проект структурирован следующим образом:

POJO:

@Entity
public class Pair {
    @Id
    @JsonIgnore
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String a;
    private String b;

    //getters and setters...

}

Контроллер покоя:

@RestController
public class PairController {

    @Autowired
    private PairServiceImpl pairService;

    @RequestMapping(value = "/pair", method = RequestMethod.POST)
    public Pair addPair(String a, String b) {
        Pair newPair = new Pair();
        newPair.setA(a);
        newPair.setB(b);
        return pairService.addNewPair(newPair);
    }

    @RequestMapping(value = "/pair", method = RequestMethod.GET)
    public List<Pair> getPairs() {
        return pairService.getPairs();
    }
}

Сервисный уровень:

@Service
public class PairServiceImpl implements PairService {
    @Autowired 
    private PairRepositoryImpl pairRepository;

    public Pair addNewPair(Pair newPair) {
        return pairRepository.save(newPair);
    }

    public List<Pair> getPairs() {
        return pairRepository.findAll();
    }
}

Репозиторий:

public interface PairRepositoryImpl extends JpaRepository<Pair, Long> {

}

И я хочуЧтобы проверить конечные точки API PairController:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {DemoApplication.class, DatabaseConfig.class})
@AutoConfigureMockMvc
@ContextConfiguration(classes = {PairController.class})
public class PairControllerTests {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private PairService pairService;

    @Test
    public void addPairTest() {
        Pair testPair = new Pair();
        testPair.setA("a");
        testPair.setB("b");
        ObjectMapper objectMapper = new ObjectMapper();

        MvcResult mvcResult =      mockMvc.perform(MockMvcRequestBuilders.post("/pair").accept(MediaType.APPLICATION_JSON)
            .content(objectMapper.writeValueAsString(testPair))).andReturn();
        //The line above throws an exception
        int status = mvcResult.getResponse().getStatus();
        assertEquals(200, status);
    }
}

Если я не добавлю @ContextConfiguration, тесты не смогут найти мою конечную точку.Я попытался записать значения a и b, когда был вызван метод addPair, и оба значения были null.Также видно, что я добавляю пользовательский класс конфигурации базы данных "DatabaseConfig", который содержит метод источника данных встроенной базы данных H2, так что в тестах не используется производственная база данных.Аннотация @EnableJpaRepositories присутствует в этом классе и указывает на репозиторий, показанный выше.

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

Я также пытался вручную создать экземпляр MockMvc, используя @Autowired в WebApplicationContext, и использовать его для инициализации экземпляра MockMvc в методе с аннотацией @Before, но конечный результат былто же самое.

Я сделал комментарий ниже строки, которая выбрасывает исключение, находящееся в классе PairControllerTests.

Так что, если я запущу приложение и протестирую его с помощью Postman и рабочей средыВ базе данных конечные точки работают, а данные сохраняются и извлекаются правильно.Эта проблема возникает только во время тестирования.

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