2017-08-02 49 views
1

我有一个Java类斯波克如何嘲笑同一类的方法为Java类

class MyClass { 
    void methodA() { 
     //something 
    } 
    void methodB() { 
     //something else 
    } 
} 

我想单元测试,但了methodA了methodA要看的methodB。我已经通过spock文档,但我无法找到如何处理这种情况。我该怎么办?

注意 我没能找到这个,所以我的自我回答上这是允许as per stackoverlfow's self-answering policy计算器这个问题的答案。添加此注意是为了避免让那些不知道自我回答策略的人士感到困惑,因此不要删除。这

回答

2

它在斯波克文档实际上记录,请参见partial mocks

// this is now the object under specification, not a collaborator 
def persister = Spy(MessagePersister) { 
    // stub a call on the same object 
    isPersistable(_) >> true 
} 

when: 
persister.receive("msg") 

then: 
// demand a call on the same object 
1 * persister.persist("msg") 
1

一种解决方案是做到以下几点在你的测试

def "your spock test"() { 
     MyClass myClass = Mock(MyClass) 
     myClass.methodA() >> { 
      callRealMethod() 
     } 
     myClass.methodB() >> { 
      //your mocking logic 
     } 
    expect: 
     //whatever you want to do 
    } 

callRealMethod允许你调用实际执行时,你是通过斯波克嘲讽。

+0

@LeonardBrünings答案在你的场景中更合适! – rafaelim

2

这是一个没有嘲笑,你重写方法需要一种方式:

def "your spock test"() { 
    MyClass myClass = new MyClass() { 
     @Override 
     void methodB() { 
      // do something related to this test 
     }  
    } 

    expect: 
    //whatever you want to do 
    myClass.methodA() 
} 
1

我会重新考虑一下这个解决方案,因为你在这里做的是you are testing mock instead of a real object。我不会在这个课堂上嘲笑任何东西,我会把它作为一个简单单位。如果methodB代表不同的单位范围,则methodA那么这可能是重构此类并将methodB中封装的职责提取到注入您正试图测试的单独类中的一个很好的起点。然后嘲笑这个注入类更有意义在我看来。但首先总是问问自己为什么要模拟,如果有更好的选择(嘲笑应该是你最后的选择值得考虑)。