gpt4 book ai didi

java - 无法使用 Spock 模拟 Java 方法调用

转载 作者:行者123 更新时间:2023-12-01 19:57:14 26 4
gpt4 key购买 nike

我正在尝试使用 Spock 模拟我的以下 java 方法。


public List<DiffEntry> listDifferences(String oldCommit, String newCommit, Git git)
throws GitAPIException, RevisionSyntaxException, AmbiguousObjectException,
IncorrectObjectTypeException, IOException {

logger.info(
"Inside DiffCommits#listDifferences to calculating difference commits refs {} and {} ",
oldCommit, newCommit);

ObjectId oldTree = git.getRepository().resolve(oldCommit);
ObjectId newTree = git.getRepository().resolve(newCommit);

if (oldTree == null || newTree == null) {
logger.warn(
"Could not resolve either old {} or new commits {}, difference cant not be calculated",
oldCommit, newCommit);
throw new RefNotFoundException("Unable to resolve tag reference. Invalid tag provided");
}

ObjectReader reader = git.getRepository().newObjectReader();
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
oldTreeIter.reset(reader, oldTree);

CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
newTreeIter.reset(reader, newTree);

DiffFormatter df = new DiffFormatter(new ByteArrayOutputStream());

df.setRepository(git.getRepository());
List<DiffEntry> entries;
entries = df.scan(newTreeIter, oldTreeIter);
df.close();

if (logger.isDebugEnabled()) {
for (int i = 0; i < entries.size(); i++) {
logger.debug("Entry: " + entries.get(i));
}
}

return entries;
}

一切正常,但以下代码的模拟失败

DiffFormatter df = new DiffFormatter(new ByteArrayOutputStream());

并在

处出现错误
df.setRepository(git.getRepository());

我收到的错误是

> org.eclipse.jgit.lib.StoredConfig$$EnhancerByCGLIB$$9a2f8398 cannot be
> cast to org.eclipse.jgit.diff.DiffConfig java.lang.ClassCastException:
> org.eclipse.jgit.lib.StoredConfig$$EnhancerByCGLIB$$9a2f8398 cannot be
> cast to org.eclipse.jgit.diff.DiffConfig at
> org.eclipse.jgit.diff.DiffFormatter.setReader(DiffFormatter.java:201)
> at
> org.eclipse.jgit.diff.DiffFormatter.setRepository(DiffFormatter.java:180)
> at
> com.sf.bt.mdm.subscription.scmdiff.DiffCommits.listDifferences(DiffCommits.java:65)
> at com.sf.bt.mdm.subscription.service.DiffCommitSpec.test list
> differences(DiffCommitSpec.groovy:59)

任何形式的帮助将不胜感激

最佳答案

DiffFormatter df = new DiffFormatter(new ByteArrayOutputStream());

从单元测试的角度来看,这段代码是有问题的。它不是依赖项,因此不能将其注入(inject)到类中。所以基本上你正在尝试模拟构造函数( new )对象。

从技术上讲,您可以尝试的唯一方法是使用全局模拟并创建包装真实对象的 spy :阅读 documentation 。这些不是常规 spock 的 Mock 和 Stub。

但是我相信还有其他方法。毕竟我向您发送的所有链接都以“使用之前请三思而后行”开头,这是有原因的;)

  1. 您自己决定将此对象创建放在方法中,这是可以的。然而,这意味着您不处理此 DiffFormatter作为真正的依赖。因此,也许即使在单元测试中,您也应该让它运行,专注于模拟其输入参数本身? ByteArrayOutputStream 也同样如此。 。一般来说,这很好地体现了这样的概念:代码应该以单元测试不应该真正关心方法的内部实现的方式编写。总是更喜欢黑盒测试而不是白盒测试。

  2. 或者,如果您认为它是依赖项,那么也许您应该将其设为数据字段。然后您可以使用常规模拟将其注入(inject)测试中。如果应在每次方法调用时创建此类,则可以注入(inject) Supplier<DiffFormatter> and in method只需调用它的 get 方法,它就会充当工厂。

关于java - 无法使用 Spock 模拟 Java 方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59029585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com