在我的模拟类中,我正在模拟方法foo().对于某些测试用例,我希望foo()的模拟实现返回一个特殊值.对于其他测试用例,我想使用foo()的实际实现.我在我的mock类中定义了一个布尔值,以便我可以在mock方法中确定是否要返回特殊值,或者使用"real"方法.问题是,我似乎无法弄清楚如何从模拟方法调用真正的方法.
我发现你可以在名为"it"的模拟对象中定义一个特殊成员(具有被模拟对象的类型).这允许您从模拟实现中引用真实类.所以,我的计划是,如果我需要调用foo()的"真正"实现,mock方法将调用it.foo().但是,这不起作用,因为调用it.foo()只是再次调用模拟版本,而不是真实版本,所以我最终得到无限递归.
有没有办法使这项工作?
编辑:使用代码示例可能更清楚,这是我当前的模拟方法实现的样子:
private RealClass it;
...
public SomeClass foo() {
if(fakeIt) {
return new SomeClass("fakevalue");
} else {
// doesn't work, just keeps calling the mock foo
// in infinite recursion
return it.foo();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:此外,对于我的大多数测试用例,我不想要模拟实现.所以我最初的尝试是在我需要模拟对象的那些测试用例中只调用Mockit.redefineMethods().但这不起作用 - 似乎你只能在setup/teardown中做到这一点......当我尝试时,我的模拟实现从未被调用过.
解决方案说明:
起初我并不认为给出的答案有效,但在使用它之后,似乎问题在于我将JMockit"核心"方法与"注释"驱动方法混合在一起.显然,在使用注释时,您需要使用Mockit.setupMocks,而不是Mockit.redefineMethods().这是最终奏效的:
@Before
public void setUp() throws Exception
{
Mockit.setUpMocks(MyMockClass.class);
}
Run Code Online (Sandbox Code Playgroud)
然后,对于模拟类:
@MockClass(realClass = RealClass.class)
public static class MyMockClass {
private static boolean fakeIt = false;
private RealClass it;
@Mock(reentrant = true)
public SomeClass foo() {
if(fakeIt) { …
Run Code Online (Sandbox Code Playgroud) 我可能错过了一些显而易见的东西,因为我是Groovy的菜鸟,但是我已经搜索过但却找不到我正在寻找的东西.我有一个测试类,我正在阅读一些XML; 我想在一系列元素的开头插入一个元素.我已经想出如何替换第一个元素,并且我已经想出如何将一个节点附加到列表的末尾,但我似乎无法理解如何在列表的开头插入一个元素(或者理想情况下,任意位置).
例如:
@Test
void foo()
{
def xml = """<container>
<listofthings>
<thing id="100" name="foo"/>
</listofthings>
</container>"""
def root = new XmlSlurper().parseText(xml)
root.listofthings.thing[0].replaceNode ( { thing(id:101, name:'bar') })
root.listofthings.appendNode ( { thing(id:102, name:'baz') })
def outputBuilder = new groovy.xml.StreamingMarkupBuilder()
String result = outputBuilder.bind { mkp.yield root }
print result
}
Run Code Online (Sandbox Code Playgroud)
产量:
<container>
<listofthings>
<thing id='101' name='bar'/>
<thing id='102' name='baz'/>
</listofthings>
</container>
Run Code Online (Sandbox Code Playgroud)
我真正想要的是在插入点开始的listofthings,即东西来取代调用replaceNode将ID为100之前的事情,而不是插入一个ID为101的事情,我也将是如果说不好听,我有一个更长的列表,在第n个元素之后插入一个节点.
(顺便提一下,有没有办法以更易读的格式获取输出?StreamingMarkupBuilder的输出都以一行文本结尾;为了清楚起见,我重新格式化了它)
编辑:我正在使用1.7.5,它与Eclipse捆绑在一起,如果重要的话.