У меня самый распространенный проект на Spring Boot MVC.и я пытаюсь записать данные обновления через PUT.
@RestController
@RequestMapping(CommentController.PATH)
public class CommentController {
public final static String PATH = "/comments";
@Autowired
private CommentService service;
@PutMapping("/{id}")
public Comment update(@RequestBody Comment comment, @PathVariable Long id) {
return service.update(id, comment);
}
}
@Service
public class CommentService {
@Autowired
private CommentRepository repository;
public Comment update(Long id, Comment entity) {
Optional<Comment> optionalEntityFromDB = repository.findById(id);
return optionalEntityFromDB
.map(e -> saveAndReturnSavedEntity(entity, e))
.orElseThrow(getNotFoundExceptionSupplier("Cannot update - not exist entity by id: " + id, OBJECT_NOT_FOUND));
}
private Comment saveAndReturnSavedEntity(Comment entity, Comment entityFromDB) {
entity.setId(entityFromDB.getId());
return repository.save(entity);
}
}
@Repository
public interface CommentRepository extends JpaRepository<Comment, Long> {
}
@Entity
public class Comment {
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "name")
protected String name;
}
, затем я пишу тест с возможностью проверки обновленных данных:
@SpringBootTest
@RunWith(SpringRunner.class)
@Transactional
// DBUnit config:
@DatabaseSetup("/comment.xml")
@TestExecutionListeners({
TransactionalTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DbUnitTestExecutionListener.class
})
public class CommentControllerTest {
private MockMvc mockMvc;
private static String route = PATH + "/{id}";
@Autowired
private CommentController commentController;
@Autowired
private CommentRepository commentRepository;
@PersistenceContext
private EntityManager entityManager;
@Before
public void setup() {
mockMvc = MockMvcBuilders.standaloneSetup(commentController)
.build();
}
@Test
public void update_ShouldReturnCreated2() throws Exception {
int id = 1;
String name = "JohnNew";
Comment expectedComment = new Comment();
expectedComment.setName(name);
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(expectedComment);
this.mockMvc.perform(put(route, id)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(json))
.andDo(print());
entityManager.clear();
entityManager.flush();
Comment commentUpdated = commentRepository.findById(1L).get();
assertThat(commentUpdated.getName(), equalTo(name)); // not equals!
}
}
comment.xml:
<dataset>
<Comment id="1" name="John" />
</dataset>
но проблема в том, что данные не обновляются.Если вы включите ведение журнала Hibernat, то также не будет запроса на обновление базы данных.Что я делаю не так?