我正在使用spock编写单元测试。在创建测试用例时,我在模拟对象并在函数调用中添加响应。但是,当在主题类/服务类中执行存根调用时,存根方法将返回null而不是实际值。如果我尝试访问测试类中的存根值,则可以访问它,但在存根类中,它为我的存根返回null。
以下是我正在执行的示例
class Test extends Specification{
def ServiceClass = new ServiceClass()
def "test doSomething method"(){
given:
String id = "id"
def cacheService = Mock(CacheService)
def obj = Mock(CacheObj)
cacheService.get(_) >> obj
obj.getValue("thisID") >> "test" //stubbing this to return test
when:
//calling dosomething() method of service class
cacheService.doSomething(id)
then:
//checking assertions here
}
}
class ServiceClass{
public String doSomething(String id){
Object obj = cacheService.get(id);
String val = obj.getValue("thisID") // while executing this, val is returning **null**, but it should ideally return "test" as it is stubbed in specification class
}
}
预期的响应是“测试”,但它返回null,这是我声明存根错误的地方吗?因为如果我在setupSpec()方法中声明此内容,那么一切都会按预期进行。
最佳答案
您应该以某种方式将模拟的CacheService
传递给ServiceClass
。
该测试的可能变体之一是:
class ServiceClassTest extends Specification {
def "doSomething(String) should return a value of cached object"() {
given: "some id"
def id = "id"
and: "mocked cached object which returns 'test' value"
def obj = Mock(CacheObj)
obj.getValue("thisID") >> "test"
and: "mocked cached service which returns the cached object by given id"
def cacheService = Mock(CacheService)
cacheService.get(id) >> obj
and: "a main service with injected the mocked cache service"
def serviceClass = new ServiceClass(cacheService)
expect:
serviceClass.doSomething(id) == "test
}
}
ServiceClass
具有相应的构造函数以传递缓存服务:class ServiceClass {
private final CacheService cacheService;
ServiceClass(CacheService cacheService) {
this.cacheService = cacheService;
}
...
}