java-Spring Boot测试:测试通过,但不应通过(假肯定)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-Spring Boot测试:测试通过,但不应通过(假肯定),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2780字,纯文字阅读大概需要4分钟。
内容图文
![java-Spring Boot测试:测试通过,但不应通过(假肯定)](/upload/InfoBanner/zyjiaocheng/664/dd8958dd692347e5a1709f28bc4374d7.jpg)
我有带有测试的Spring Boot项目,它不会失败(但应该).
我是在做错什么,还是Spring的问题?
作为一个小示例,我创建了一个小项目,其中包含2个实体(用户和类别)和一个具有DELETE方法(https://github.com/sk8ter/demo)的Controller类.
类别实体的ID为不带级联选项的用户实体,因此在删除具有类别的用户时应该失败:
@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();
}
}
如果我从DemoApplicationTests中删除@Transactional批注,则测试将失败,但是在这种情况下,更改将提交给数据库.
测试中注释3行也无济于事.
解决方法:
我不想使用@Rollback(false)注释方法或类,因为我希望所有测试都为idempotent.如果我注释@Rollback(false),H2也会因外键约束而失败.
我找到了解决方案:
@Transactional
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class)
public class DemoApplicationTests {
@Autowired
protected WebApplicationContext context;
protected MockMvc mockMvc;
@PersistenceContext
EntityManager em;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public void testName() throws Exception {
mockMvc.perform(delete("/users/1"))
.andExpect(status().isOk());
em.flush();
}
}
关键线:
@PersistenceContext
EntityManager em;
...
// Manual flush is required to avoid false positive in test
em.flush();
所以SessionFactory从Spring Documentation开始不起作用
// Manual flush is required to avoid false positive in test
sessionFactory.getCurrentSession().flush();
内容总结
以上是互联网集市为您收集整理的java-Spring Boot测试:测试通过,但不应通过(假肯定)全部内容,希望文章能够帮你解决java-Spring Boot测试:测试通过,但不应通过(假肯定)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。