这很奇怪:我使用JUnit
与JMock
使用Rule
JUnitRuleMockery一段时间后,它总是运行得很好:期望在最后检查测试,如果一个(或多个)缺失测试失败。但是,这段代码在Eclipse中不起作用(DAO
是org.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
行为不正常吗?
答案 0 :(得分:1)
我终于找到了问题。
问题确实与他的评论中提到的jeremyjjbrown类路径相关,但与Eclipse-Gradle plugin及其导入项目的方式有关。
我是如何解决问题的
gradle cleanEclipse
gradle eclipse
Import
之后的项目 - &gt; Existing Projects into Workspace
这确实解决了问题,但后来我无法直接在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亲自帮助我调试并解决问题的真正