2014-12-31 131 views
2

我正在使用用Groovy编写的Spock测试来测试一些Java代码。我使用JMockit来模拟java代码中的方法,因为Spock只处理嘲笑的Groovy类。我遇到了测试之间存在JMockit MockUp的问题。这样的模拟实例应该只存在于测试中(根据JMockit文档),但这不起作用,我想这是因为它没有使用JMockit测试运行器,而是使用Spock测试运行器。JMockit MockUp坚持Spock测试

这是我面临的问题的最简单的例子。我有一个简单的方法返回一个字符串,我可以用MockUp更改该方法的返回值,但它仍然存在第三个测试,它不会被使用。

的Java类

public class ClassToTest { 
    public String method() { 
     return "original"; 
    } 
} 

斯波克测试

class ClassToTestSpec extends Specification { 
    void "first test"() { 
     when: 
     String result = new ClassToTest().method() 

     then: 
     result == "original" 
    } 

    void "second test"() { 
     setup: 
     new MockUp<ClassToTest>() { 
      @Mock 
      public String method() { 
       return "mocked" 
      } 
     } 

     when: 
     String result = new ClassToTest().method() 

     then: 
     result == "mocked" 
    } 

    void "third test"() { 
     when: 
     String result = new ClassToTest().method() 

     then: 
     result == "original" 
    } 
} 

第三个测试失败,因为ClassToTest.method()仍返回字符串 “嘲笑”,而不是 “原始”。使用调试器我已验证Mocked方法被调用两次。

问题

有什么办法来手动删除JMockit类MockUp?谢谢。

+0

Spock可以模拟Java和Groovy类。嘲笑被测试的班级是一种气味,应该小心使用。 –

+0

感谢@PeterNiederwieser的回应,我无法使用正常表示法'instance.method()>> result',你能指出我的方向吗? – mnd

+0

临时表示符号工作,我忘了用'Mock'实例化对象,比如'ClassToTest instance = Mock(ClassToTest)'。现在要弄清楚如何使这个部分模拟,可能与间谍。 – mnd

回答

2

您可以在创建的模型对象上调用MockUp.tearDown方法手动撤消其效果。

+0

太棒了!谢谢@Rogerio! – mnd

+0

我个人在spock测试中没有使用tearDown方法。如果有人已经得到这个工作,我希望看到一个示例规范。谢谢。至于现在,我正在避免Jockey。 – keaplogik

1

不完全是问题的答案 - 因为我仍然不知道JMockit的MockUp是否可以手动删除。但是,由于@ PeterNiederwieser的评论,我发现你实际上可以为Java类创建一个部分模拟。以下是对上面第二个测试的更改。

void "second test"() { 
    setup: 
    ClassToTest test = Spy(ClassToTest) { 
     method() >> "mocked" 
    } 

    when: 
    String result = test.method() 

    then: 
    result == "mocked" 
} 

彼得提到反思的方式和内容进行测试,如果Spy()是必要的,但对我的使用情况下,这是首选。