Я пытаюсь написать тесты для моего контроллера покоя и получаю 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 и рабочей средыВ базе данных конечные точки работают, а данные сохраняются и извлекаются правильно.Эта проблема возникает только во время тестирования.