我正面临着一个我不知道如何解决的问题。我正在开发一个Spring MVC应用程序及其单元和集成测试。一切在JUnit下运行(运行方式 - > JUnit测试)但是当我在Maven下时(Surefire 2.10)我有两种类型错误:
模型测试
testFileNameCannotBeNull(es.kazbeel.geckobugtracker.model.AttachmentTest): Unexpected exception, expected<org.hibernate.exception.ConstraintViolationException> but was<org.hibernate.PropertyValueException>
控制器测试
testCreateEnvironmentPost_withBindingResultErrors(es.kazbeel.geckobugtracker.web.controller.admin.EnvironmentControllerTest): View name expected:</admin/environments/CreateEnvironment> but was:<redirect:/admin/environments/ViewEnvironments>
AttachmentTest (只有失败的方法)
@Test(expected = ConstraintViolationException.class)
@DatabaseSetup("AttachmentTest.xml")
@Transactional
public void testFileNameCannotBeNull () {
Session session = sessionFactory.getCurrentSession();
Issue issue = (Issue) session.get(Issue.class, 1);
User author = (User) session.get(User.class, 1);
Attachment attch = AttachmentBuilder.attachment()
.withIssue(issue)
.withAuthor(author)
.withFileName(null)
.withFileSize(new Long(0))
.withFileMimeType("file_mimetype")
.build();
session.save(attch);
session.flush();
session.clear();
}
在这种情况下,模型在 hbm.xml 中配置。该财产如下
<property generated="never" lazy="false" length="255" name="fileName" column="FILE_NAME" not-null="true" type="java.lang.String">
EnvironmentControllerTest (只有失败的方法)
@Test
public void testCreateEnvironmentPost_withBindingResultErrors () throws Exception {
mockMvc.perform(post("/admin/environments/CreateEnvironment").param("name", ""))
.andExpect(view().name("/admin/environments/CreateEnvironment"))
.andExpect(model().hasErrors())
.andExpect(model().size(1))
.andExpect(model().attributeExists("environment"));
verify(issueService, never()).saveEnvironment(any(Environment.class));
}
EnvironmentController (仅限方法)
@RequestMapping(value = "/CreateEnvironment", method = RequestMethod.POST)
public String createEnvironmentPost (@Valid @ModelAttribute("environment") Environment environment,
BindingResult result) {
LOG.debug("Creating new Environment");
if (result.hasErrors() == true) {
LOG.debug("The environment is not valid: {}", result.getFieldError().getDefaultMessage());
return CREATE_URL;
}
try {
issueService.saveEnvironment(environment);
} catch (DataIntegrityViolationException ex) {
LOG.debug(ex.getMessage());
return CREATE_URL;
}
return "redirect:" + VIEW_URL;
}
pom.xml (仅与surefire相关)
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>default-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
此致,我迷路了(我甚至不知道应该向您展示有关此问题的哪些信息)。
有谁知道可能会发生什么?我没有在互联网上找到任何类似的冲浪。
!更新!
删除pom.xml中的依赖项(见下文)(但保留javax.validation
)我得到了在JUnit下运行测试的相同异常。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.1.Final</version>
</dependency>
OK!这是领先一步,但这让我想知道this assertion是否属实。我确信验证是第一次验证/检查,但似乎Hibernate的属性检查首先接管。我是对的吗?
答案 0 :(得分:3)
<强>第一强>
<强>问题即可。当在同一个项目中包含两个验证器时,似乎是一种不兼容性:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.1.Final</version>
</dependency>
<强>解决方案即可。我从 pom.xml 中删除了javax.validation
。
注意:如果我错了,请非常感谢您的解释。
<强>第二强>
<强>问题即可。解决了第一个问题后,我仍然没有成功运行测试。
<强>解决方案即可。我在Hibernate Validator的官方webpage上找到了解决方案。
统一表达式语言(EL)Hibernate Validator也需要一个 统一表达语言(JSR 341)的实现 评估约束违规消息中的动态表达式。什么时候 您的应用程序在Java EE容器中运行,例如WildFly,EL 容器已经提供了实现。在Java SE中 但是,您必须将实现添加为依赖项 到您的POM文件。例如,您可以添加以下两个 依赖关系以使用JSR 341参考实现:
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.4</version>
</dependency>