Как протестировать метод, который сохраняет объект в базе данных с Hibernate? - PullRequest
0 голосов
/ 31 января 2020

Я написал приложение CRUD (Notebook), и теперь я учусь тестировать мой код. Я написал несколько тестов, используя макеты, но в этом случае Idk, как проверить, например, мой метод -> addNote. Я искал несколько страниц с тестированием CRUD, но я не нашел подобный код для этого.

Это мой контроллер:

@Controller
public class NoteController {


private NoteService noteService;

@Autowired
public NoteController(NoteService noteService) {
    this.noteService = noteService;
}

@GetMapping("/notebook")
public String getNotebook(Model model)
{
    model.addAttribute("notes",noteService.getNotes());
    model.addAttribute("newNote",new Note());
    return "main-view";
}

@PostMapping("/notebook/add-note")
public String addNote(Model model, @ModelAttribute Note note)
{
    if(note.getTitle()==null || note.getTitle() == null)
    {
        model.addAttribute("errorMessage","You have to fill in the title and text, to save the note");
    }
    else {
        noteService.saveNote(note.getTitle(), note.getText());
    }
    return "redirect:/notebook";
}

@GetMapping("/notebook/{id}")
public String getNoteById(Model model, @PathVariable Long id)
{
    Note note = null;
    try {
        note = noteService.findNoteById(id);
    }
    catch (Exception e)
    {
        model.addAttribute("errorMessage","Note not found");
    }
    model.addAttribute("note", note);
    return "show-note";
}

@RequestMapping(value = "/notebook/{id}/edit", method = {RequestMethod.POST,RequestMethod.GET})
public String editNoteById(Model model, @PathVariable Long id,@ModelAttribute Note updatedNode)
{
    if(updatedNode!=null)
    {
        noteService.update(updatedNode);
    }
    Note note = null;
    try {
        note = noteService.findNoteById(id);
    }
    catch (Exception e)
    {
        model.addAttribute("errorMessage","Note not found");
    }
    model.addAttribute("edit",true);
    model.addAttribute("note", note);

    return "show-note";
}

@PostMapping("/notebook/{id}/delete")
public String deleteNote(@PathVariable Long id)
{
    noteService.deleteNote(id);
    return "redirect:/notebook";
}

И единственное, что я смог протестировать с помощью метода addNote, это перенаправление:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ApiTest {

@Autowired
MockMvc mockMvc;

@Test
public void addNote() throws Exception {

    mockMvc.perform(post("/notebook/add-note")
            .param("title","mmtitle")
            .param("text", "mmtext"))
            .andExpect(redirectedUrl("/notebook"));

}

Как видите, Я также использую param, который создает новый объект в моей базе данных, но я не знаю, как проверить это с помощью test. Можете ли вы сказать мне, как я могу это сделать, или связать меня с любым источником, где я могу научиться тестированию с помощью макетов?

Ответы [ 2 ]

0 голосов
/ 31 января 2020

вы действительно можете протестировать с базой данных в памяти, но если вы предпочитаете основанный на имитации подход, вы можете протестировать поведение задействованных объектов, предполагая, что базовый код Hibernate работает: -)

@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
@SpringBootTest
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class ControllerTest {

  @Autowired
  private MockMvc mockMvc;

  @MockBean
  private NoteRepository noteRepository;

  @Test
  public void addNote() throws Exception {

    String json = "{" +
            "\"id\":1," +
            "\"name\":\"my note\"" +
            "}";

    this.mockMvc.perform(post("/notebook/add-note")
            .contentType(MediaType.APPLICATION_JSON).content(json)
            .andExpect(status().isOk());

    verify(noteRepository, times(1)).save(isA(Note.class));

}

Используя макет NoteRepository, вы можете проверить, какие методы вызываются и сколько раз.

Вам потребуется исключить DataSourceAutoConfiguration, чтобы отключить автоматическую инициализацию источника данных (что вам не нужно, если вы тестируете без работающей базы данных).

0 голосов
/ 31 января 2020

Как правило, вы проверяете только тот код, который написали. Можно с уверенностью предположить, что драйвер базы данных работает.

Если вы хотите убедиться, что запись действительно оказалась в базе данных, попросите Spring автоматически подключить хранилище для вас.

@Autowired
private NoteRepository noteRepository;

Для этого необходимо настроить базу данных для тестирования. Большинство сконфигурированной системы Spring Boot поставляются с базами данных Lightwight в памяти H2 или H SQL.

Затем вы можете запросить базу данных с помощью репозитория и убедиться, что можете загрузить сохраненную запись оттуда.

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