【发布时间】:2023-04-01 10:45:01
【问题描述】:
我正在为我的 Spring Data Rest 存储库编写测试用例:
@RepositoryRestResource(collectionResourceRel = "teams", path = "teams")
public interface TeamRepo extends JpaRepository<Team, Long> {}
一切正常,但是当我使用 put 方法更新无效资源时,mockmvc 总是返回状态 204。 代码如下:
@Test
@Transactional
public void updateInvalidResourceFail_thenReturn400() throws Exception {
final Team resource = createNewResource();
invalidate(resource); // Some properties violate uniqueness constraints
final String resourceAsString = marshaller.encode(resource);
mvc.perform(
put("/api/teams/1")
.contentType(marshaller.getMime())
.content(resourceAsString)
).andExpect(status().isBadRequest()).andDo(print());
TestTransaction.flagForCommit();
TestTransaction.end();
}
mockmvc:
protected MockMvc mvc;
@Autowired
private WebApplicationContext context;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}
错误:
java.lang.AssertionError: Status
Expected :400
Actual :204
但是,PostMan 会返回正确的结果和相同的无效数据:
{
"status": "BAD_REQUEST",
"instant": "2018-06-13T06:16:20.975Z",
"message": "Database error, Constraint Violation",
"debug": "could not execute statement"
}
当我将期望状态更改为 204 时,
.andExpect(status().isNoContent()).andDo(print());
我得到了预期的异常:
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
原因:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: #23000
看起来 mockmvc 总是返回 204。我哪里出错了?
编辑
实体团队:
@Entity
@ToString
@DynamicUpdate
@DynamicInsert
@Table(name = "bus_team", schema = "test", uniqueConstraints = {
@UniqueConstraint(columnNames = {
"name"
})
})
public class Team{
private Long id;
private String name;
private String description;
private String division;
// ... getter, setter
}
方法无效(团队团队):
void invalidate(Team team){
team.setName("name already exists");
}
【问题讨论】:
-
您希望违反什么样的约束?您如何使数据无效?
-
@robjwilkins,感谢您的回复。我只是将团队的名称设置为现有值。您可以阅读我编辑的问题以获取更多详细信息。
标签: java spring junit mockito spring-data-rest