RevCommit JGit 模拟

jmc*_*mcg 2 java unit-testing mockito jgit

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

RevCommit revCommitMock = mock(RevCommit.class);        
Mockito.when(revCommitMock.getShortMessage()).thenReturn("ExampleMessage");
Run Code Online (Sandbox Code Playgroud)

这将导致一个NullPointerException.

也许,正确的方法是调用方法:

parse(RevWalk rw, byte[] raw) 
Run Code Online (Sandbox Code Playgroud)

在对象的实例上RevCommit,但如何正确地做到这一点?我得到了NullPointerException解析类型的模拟对象RevWalk。感谢您提前提供的任何帮助。

Rüd*_*ann 5

为了避免这种情况NullPointerException,您需要完全模拟真实的行为RevCommit。为了使其在各个方面的行为都正确,您最终将重新构建实际的大部分内容RevCommit为了使其行为在各个方面都正确,您最终将在 JGit 中

这就是为什么我建议针对真实存储库运行测试。由于上述原因,通常不建议模拟您不拥有的类型(请参阅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
  }
}
Run Code Online (Sandbox Code Playgroud)

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