EmptyResultDataAccessException при тестировании контроллера Spring - PullRequest
0 голосов
/ 08 февраля 2020

В моем приложении есть контроллер, сервис, репо и класс. Я пишу юнит-тест для проверки моего запроса PUT. В почтальоне запрос на вставку работает нормально, однако при тестировании в тесте JUnit выдает ошибку EmptyResultDataAccessException. Многие другие тесты имеют ту же проблему, и все они требуют найти конкретную запись c в репо по идентификатору. Я думаю, что это проблема. Пожалуйста помоги мне с этим.

@Data
@Entity
public class ErrorMessage {
    private @Id @GeneratedValue Long id;
    private String message;
    private int code;

    public ErrorMessage() {
    }

    public ErrorMessage(int code, String message) {
        this.code = code;
        this.message = message;
    }
}
@Repository
interface ErrorMessageRepository extends JpaRepository<ErrorMessage, Long> {
    List<ErrorMessage> findByCode(int code);
}
@Service
public class ErrorMessageService {

    @Autowired
    ErrorMessageRepository repository;

    @Transactional  
    public List<ErrorMessage> getAll()
    {   
        return repository.findAll();
    }

    @Transactional(readOnly = true) 
    public Optional<ErrorMessage> getById(Long id)
    {   
        return repository.findById(id);
    }

    @Transactional(readOnly = true) 
    public List<ErrorMessage> getByCode(int code)
    {   
        return repository.findByCode(code);
    }

    @Transactional  
    public ErrorMessage saveOne(ErrorMessage messages)
    {   
        return repository.save(messages);
    }

    @Transactional  
    public Optional<ErrorMessage> deleteById(long id)
    {   
        Optional<ErrorMessage> em = repository.findById(id);
        repository.deleteById(id);
        return em;
    }

    @Transactional  
    public ErrorMessage updateById(long id, ErrorMessage newMessage)
    {   
        ErrorMessage m = repository.findById(id).get(); 
        m.setCode(newMessage.getCode());
        m.setMessage(newMessage.getMessage());
        repository.save(m);
        return m;
    }
}

class ErrorMessageController {
    private static final Logger log = LoggerFactory.getLogger(ErrorMessageController.class);

    @Autowired
    ErrorMessageRepository repository;

    @Autowired
    private ErrorMessageService ems;

    @GetMapping("/errormessages")
    public List<ErrorMessage> getAll() {
        return ems.getAll();
    }

    @GetMapping("/errormessagesbycode/{code}")
    public List<ErrorMessage> getByCode(@PathVariable int code) {
        return ems.getByCode(code);
    }

    @GetMapping("/errormessage/{id}")
    ErrorMessage getById(@PathVariable Long id) {
        return ems.getById(id)
                .orElseThrow(() -> new MessageNotFoundException(id));
    }

    @PostMapping("/errormessage")
    ErrorMessage newMessage(@RequestBody ErrorMessage newMessage) {
        return ems.saveOne(newMessage);
    }

    @DeleteMapping("/errormessage/{id}")
    Optional<ErrorMessage> deleteMessage(@PathVariable Long id) {
            return ems.deleteById(id);
    }

    @PutMapping("/errormessage/{id}")
    ErrorMessage updateMessage(@PathVariable Long id, @RequestBody ErrorMessage newMessage) {
        return ems.updateById(id, newMessage);
    }

}

@SpringBootTest
@AutoConfigureMockMvc
public class ErrorMessageTest {

    private static ErrorMessage em, emId;
    private static ObjectMapper mapper;

    @Autowired
    private MockMvc mockMvc;

    @BeforeAll
    public static void init() throws Exception {
        mapper = new ObjectMapper();
        em = new ErrorMessage(400, "bad request0");
        emId = new ErrorMessage(400, "bad request0");
        emId.setId(Long.valueOf(1));
    }

    @Test
    void putMessage() throws Exception {
        ErrorMessage modifiedMessage = new ErrorMessage(400, "modified");
        this.mockMvc.perform(MockMvcRequestBuilders
                    .put("/errormessage/{id}", emId.getId())
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(mapper.writeValueAsString(modifiedMessage)))
                    .andExpect(status().isOk())
                    .andExpect(content().string(mapper.writeValueAsString(modifiedMessage)));
    }
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Я обнаружил ошибку. Порядок юнит-теста является случайным. Все, что мне нужно сделать, это использовать @Order для обеспечения порядка.

0 голосов
/ 08 февраля 2020

Попробуйте это

@Test
void putMessage() throws Exception {

    ErrorMessage modifiedMessage = new ErrorMessage(400, "modified");

    ErrorMessageService errorMessageService = Mockito.mock(ErrorMessageService.class);
    Mockito.when(errorMessageService.updateById(Mockito.any(), Mockito.any())).thenReturn(modifiedMessage);


    this.mockMvc.perform(MockMvcRequestBuilders
                .put("/errormessage/{id}", emId.getId())
                .contentType(MediaType.APPLICATION_JSON)
                .content(mapper.writeValueAsString(modifiedMessage)))
                .andExpect(status().isOk())
                .andExpect(content().string(mapper.writeValueAsString(modifiedMessage)));
}
...