时髦:如何模拟/存根协作者的 getter 并使其返回存根



我正在用时髦编写一个测试,想知道如何存根一个作为协作者协作者的界面(从我的被测类 (CUT( 的角度来看(。

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()
}
}

我的切工:

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
}
}

几乎!您也只需要使用记录器存根:

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(( 获取接口的实现。

对于时髦的开发人员进行单元测试,我有一个建议,请查看这个很棒的框架:spock 框架!

最新更新