RevCommit JGit 模拟

RevCommit JGit mock

我的问题是关于从 JGit 库中模拟一个 RevCommit 对象。 当简单地模拟这种类型的对象并定义它的行为时,我得到一个错误。例如:

RevCommit revCommitMock = mock(RevCommit.class);        
Mockito.when(revCommitMock.getShortMessage()).thenReturn("ExampleMessage");

这将导致 NullPointerException

大概,正确的方法是调用方法:

parse(RevWalk rw, byte[] raw) 

RevCommit 对象的实例上,但如何正确执行?我得到 NullPointerException 解析类型 RevWalk 的模拟对象。 提前感谢您的帮助。

要避免 NullPointerException,您需要完全模拟真实 RevCommit 的行为。要使其在所有方面都正确运行,您最终需要在 JGit 中重新构建大部分实际 RevCommit 实现。

这就是为什么我建议 运行 针对真实存储库进行测试。出于上述原因,通常不建议模拟您不拥有的类型(参见 https://github.com/mockito/mockito/wiki/How-to-write-good-tests)。

并且使用 JGit 创建测试存储库非常简单:

public class JGitTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();
  private Git git;

  @Before
  public void setUp() throws GitAPIException {
    git = Git.init().setDirectory(tempFolder.getRoot()).call();
  }

  @After
  public void tearDown() {
    git.getRepository().close();
  }

  @Test
  public void testFirst() {
    // with 'git' you have access to a fully functional repository
  }
}

请参阅此处了解另一个初始化存储库并使用 TemporaryFolder 进行清理的示例:https://gist.github.com/rherrmann/5341e735ce197f306949fc58e9aed141