У меня есть проект Spring Boot с тестом, который не терпит неудачу (но должен).
Я делаю что-то не так или это проблема с Spring?
В качестве небольшого примера я создал небольшой проект с двумя сущностями (пользователь и категория) и одним классом контроллера с методом DELETE (https://github.com/sk8ter/demo).
Сущность категории имеет идентификатор сущности пользователя без опции cascade, поэтому при удалении пользователя с категорией произойдет сбой:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue
private long id;
private String name;
...
}
@Entity
@Table(name = "category")
public class Category {
@Id
@GeneratedValue
private long id;
private String name;
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
...
}
Контроллер тоже довольно прост:
@RestController
@RequestMapping(value = "/users", produces = "application/json;charset=UTF-8")
public class UserCategory {
@Autowired
private UserRepository userRepository;
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/{id}", method = DELETE, consumes = MediaType.ALL_VALUE)
public void deleteCategory(@PathVariable Long id) {
User user = userRepository.getOne(id);
userRepository.delete(user);
}
}
И, наконец, тест:
@Transactional
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class)
public class DemoApplicationTests {
@Autowired
protected WebApplicationContext context;
protected MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public void testName() throws Exception {
mockMvc.perform(delete("/users/1"))
.andExpect(status().isOk());
// EntityManagerFactory entityManagerFactory = context.getBean(EntityManagerFactory.class);
// SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
// sessionFactory.getCurrentSession().flush();
}
}
Тест завершится ошибкой, если я удалю аннотацию @Transactional из DemoApplicationTests, но в этом случае изменения будут зафиксированы в БД.
Закомментированные 3 строчки в тесте тоже не помогают.