首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Spock Spy?

如何使用Spock Spy?
EN

Stack Overflow用户
提问于 2019-03-11 15:50:12
回答 1查看 423关注 0票数 0

我试图使用间谍测试,但它不起作用。下面的类是一个Sut。

代码语言:javascript
复制
public class FileManager {
    public int removeFiles(String directory)    {
        int count = 0;
        if(isDirectory(directory))  {
            String[] files = findFiles(directory);
            for(String file : files)    {
                deleteFile(file);
                count++;
            }
        }
        return count;
    }

    private boolean isDirectory(String directory) {
        return directory.endsWith("/");
    }

    private String[] findFiles(String directory) {
        // read files from disk.
        return null;
    }

    private void deleteFile(String file)    {
        // delete a file.
        return;
    }
}

然后,我创建了一个如下所示的测试。

代码语言:javascript
复制
class SpyTest extends Specification  {
def "Should return the number of files deleted"()   {
    given:
    def fileManager = Spy(FileManager)
    1 * fileManager.findFiles("directory/") >> { return ["file1", "file2", "file3", "file4"] }
    fileManager.deleteFile(_) >> { println "deleted file."}

    when:
    def count = fileManager.removeFiles("directory/")

    then:
    count == 4
}

但我找到NullPointerException了。

代码语言:javascript
复制
java.lang.NullPointerException
at example.spock.mock.FileManager.removeFiles(FileManager.java:8)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at org.spockframework.mock.runtime.CglibRealMethodInvoker.respond(CglibRealMethodInvoker.java:32)
at org.spockframework.mock.runtime.MockInvocation.callRealMethod(MockInvocation.java:60)
at org.spockframework.mock.CallRealMethodResponse.respond(CallRealMethodResponse.java:29)
at org.spockframework.mock.runtime.MockController.handle(MockController.java:49)
at org.spockframework.mock.runtime.JavaMockInterceptor.intercept(JavaMockInterceptor.java:72)
at org.spockframework.mock.runtime.CglibMockInterceptorAdapter.intercept(CglibMockInterceptorAdapter.java:30)
at example.spock.mock.SpyTest.Should return the number of files deleted(SpyTest.groovy:13)

这意味着调用的是真正的方法。有没有什么原因导致它不能工作?

EN

回答 1

Stack Overflow用户

发布于 2019-03-12 05:42:59

在Spock中,你不能模拟java类的私有方法。看看你的FileManager,你不明白为什么只有removeFiles是公开的,而其他的是私有的。尽管所有方法都与文件管理相关。可能的解决方案是:

  1. 使其余的FileManager方法成为公共方法。这样Spock就可以工作了,FileManager实际上将成为一个文件管理器,而不仅仅是文件remover
  2. Decompose FileManager到不同的组件中。所以你可以单独模拟这些组件,并将它们注入到“文件删除程序”中。基本上,您已经在方法级别对代码进行了分解。但是私有java方法是not mockable in Spock的。而且,类分解可能是一种开销,因为FileManager看起来与它的所有operations
  3. Use、其他可以模拟私有方法的测试/模拟框架具有某种程度的内聚性。例如mockito和powermock。但是,模拟私有方法是最糟糕的选择,因为如果

失控,从长远来看,它可能会损害整个代码库的可维护性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55097304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档