2017-07-17 38 views
0

我正在编写与groovy测试,并想知道如何存根据协作者的协作者的接口(从我的类测试(CUT)看法)。groovy:如何模拟/存根协作者的getter,并使其返回一个存根

project.logger会返回接口org.gradle.api.Project.Logger的一个实例,而logger是我需要模拟的getter。

任何想法如何创建一个记录器没有实现记录器接口,并让我的剪切实例返回它? 我想我错过了一些东西,因为我对模拟测试很陌生。

感谢 月

测试用例:

import org.gradle.api.Project 

class MyClassUnderTestTestCase{ 
    @Test 
    void testDoSomething(){ 
     StubFor projectStub = new StubFor(Project) 
     projectStub.demand.getLogger { } // create a Logger stub here? 

     projectStub.use { 
      def project = { } as Project 
      MyClassUnderTest cut = new MyClassUnderTest(project) 
      cut.doSomething() 
      //Further assertions 
     } 
     projectStub.expect.verify() 
    } 
} 

我CUT:

import org.gradle.api.Project 

class MyClassUnderTest{ 
    private Project project 

    MyClassUnderTest(Project project){ 
     this.project = project 
    } 

    void doSomething(){ 
     project.logger.info "Start doing something..." // project.logger should now return a stubbed instance of Logger 
     //Do some stuff 
    } 
} 

回答

0

差不多!你只需要使用记录存根也:

class MyClassUnderTestTestCase{ 
    @Test 
    void testDoSomething(){ 
     // Stubbing interface! 
     StubFor loggerStub = new StubFor(Logger) 
     loggerStub.demand.info { msg -> println "Mocked $msg" } 
     // Logger interface proxy 
     Logger loggerProxy = loggerStub.proxyInstance() 

     // Stubbing interface! 
     StubFor projectStub = new StubFor(Project) 
     projectStub.demand.getLogger { loggerProxy } 
     // Project proxy instance 
     Project projectProxy = projectStub.proxyInstance() 

     // Inject the proxy instance of Project 
     MyClassUnderTest cut = new MyClassUnderTest(projectProxy) 
     cut.doSomething() 

     // Verify the proxy interaction 
     projectStub.verify(projectProxy) 
    } 
} 

如果您正在使用的接口,则需要使用proxyInstance来获取接口的实现()。

我有一个建议groovy开发人员进行单元测试,检查这个真棒框架:spock framework

+0

很酷,我不知道我可以嵌套stub.use封闭。 但现在我得到一个空指针: '显示java.lang.NullPointerException:在org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)空对象 \t上不能调用方法的信息()' –

+0

也许如果您将项目更改为新项目()?我在这里做了一些测试,这是你的代码和我的代码之间的唯一区别。 – rafaelim

+0

项目和记录器是接口,我不能实例化它一个新的项目。 我想利用这个事实,我不必提供那些虚拟实现或搜索实现类来实例化,因为这些接口真的很重(实现这两个类总计高达1000位置) –