Spring - 从JUnit和Maven运行时的不同测试结果

时间:2015-01-23 08:38:12

标签: java spring maven spring-mvc junit

我正面临着一个我不知道如何解决的问题。我正在开发一个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的属性检查首先接管。我是对的吗?

1 个答案:

答案 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>