JUnit,JMock,JUnitRuleMockery:我错过了什么

时间:2014-02-20 18:09:29

标签: java eclipse junit gradle jmock

这很奇怪:我使用JUnitJMock使用Rule JUnitRuleMockery一段时间后,它总是运行得很好:期望在最后检查测试,如果一个(或多个)缺失测试失败。但是,这段代码在Eclipse中不起作用(DAOorg.mongodb.morphia.dao.DAO中描述的接口):

  @Rule public JUnitRuleMockery context = new JUnitRuleMockery();

  private DAO<Cobrand, ObjectId> dao = context.mock(DAO.class);
  private final Retriever service = new Retriever(dao);

  @Test
  public void canRetrieveASinglePropertyValue () throws NoSuchFieldException, IllegalAccessException
  {
    context.checking(new Expectations()
    {
      {
        oneOf(dao).findOne("cobrand", "cobrandName"); will(returnValue(prepareFakeCobrand("cobrandName")));
        oneOf(dao).findOne("cobrand", "cobrandName"); will(returnValue(prepareFakeCobrand("cobrandName")));
      }
    });

    String value = service.getValue("cobrandName", "property");

    assertThat(value, equalTo("value"));

    //context.assertIsSatisfied();
  }

当我说“不工作”时,我的意思是我必须取消注释行context.assertIsSatisfied();才能看到测试失败(在Eclipse中我将此类作为Junit测试运行)。为了完整性,这是代码service.getValue,其中findOne只能被清楚地调用一次:

public String getValue (String cobrandName, String property)
{
  Cobrand cobrand = cobrandDAO.findOne("cobrand", cobrandName);
  return "value";
}

我使用Gradle来管理我的构建,如果我执行命令gradle clean test,并且注释了行context.assertIsSatisfied();,则测试失败。这是我的build.gradle

dependencies {
  def hamcrestVersion = "1.3"
  def jmockVersion = "2.6.0"

  compile 'org.mongodb.morphia:morphia:0.106'

  testCompile "org.hamcrest:hamcrest-core:${hamcrestVersion}"
  testCompile "org.hamcrest:hamcrest-library:${hamcrestVersion}"
  testCompile "org.jmock:jmock:${jmockVersion}"
  testCompile "org.jmock:jmock-junit4:${jmockVersion}"
  testCompile 'junit:junit:4.11'
}

我做错了什么?我该怎么做才能检查为什么Run As - &gt;当JUnit test执行相同的代码(测试失败)时,Eclipse中的gradle clean test行为不正常吗?

1 个答案:

答案 0 :(得分:1)

我终于找到了问题。
问题确实与他的评论中提到的jeremyjjbrown类路径相关,但与Eclipse-Gradle plugin及其导入项目的方式有关。 我是如何解决问题的

  1. 删除了Eclipse中的项目
  2. 转到终端,在项目源文件夹
  3. 键入gradle cleanEclipse
  4. 键入gradle eclipse
  5. 在Eclipse中,导入Import之后的项目 - &gt; Existing Projects into Workspace
  6. 这确实解决了问题,但后来我无法直接在Eclipse内部管理Gradle(即我无法right click - &gt; Gradle - &gt; Refresh All)因为项目没有没有Gradle性质。将其转换为Gradle项目使原始问题重新出现。所以,最后,

    我是如何真正解决问题的
    查看我的gradle.build,您可以看到testCompile "org.jmock:jmock-junit4:2.6.0"。 jMock有一个微妙的问题:它带来了junit-dep:4.4。 Eclipse中的这种依赖性导致了问题,将相关的jar插入到类路径中。将testCompile行更改为

    testCompile ("org.jmock:jmock-junit4:${jmockVersion}") {
      exclude group:"junit"
    }
    

    真的解决了这个问题。

    我感谢pbanfi亲自帮助我调试并解决问题的真正