【问题标题】:Junit verify method never runs passing when it should failJunit验证方法在它应该失败时永远不会运行通过
【发布时间】:2016-08-12 21:25:43
【问题描述】:

我有这个单元测试:

@RunWith (MockitoJUnitRunner.class)
public class RefChangEventTest {
    @Mock
    RefChange ref;

    @Mock
    SEPCommits sepCommits;

    @Mock
    SEPRefChangeEvent sepRefChangeEvent;

    @Mock
    RepositoryRefsChangedEvent refsChangedEvent;

    @Mock
    Repository repo;

    @Test
    public void gitNotesAreIgnored() throws Exception {
        Collection<RefChange> refList = new ArrayList<RefChange>(1);
        ArrayList commitListMock = mock(ArrayList.class);
        refList.add(ref);
        when(refsChangedEvent.getRefChanges()).thenReturn(refList);
        when(refsChangedEvent.getRepository()).thenReturn(repo);
        when(ref.getRefId()).thenReturn("refs/heads/foo");
        when(sepRefChangeEvent.makeArrayList()).thenReturn(commitListMock);

        sepRefChangeEvent.processEvent(refsChangedEvent);
        verify(sepCommits, never()).findCommitInfo(ref, repo, commitListMock);
    }

}

和匹配它的源代码在这里:

public ArrayList<Message> makeArrayList() {
    return new ArrayList<Message>();
}

@Override
public List<Message> processEvent(RepositoryRefsChangedEvent event) {
    ArrayList<Message> commitList = makeArrayList();

    for (RefChange refChange : event.getRefChanges()) {
        LOGGER.info("checking ref change refId={} fromHash={} toHash={} type={}", refChange.getRefId(), refChange.getFromHash(),
                refChange.getToHash(), refChange.getType());

        if (refChange.getRefId().startsWith(REF_BRANCH)) {
            if (refChange.getType() == RefChangeType.ADD && isDeleted(refChange)) {
                LOGGER.info("Deleted a ref that never existed. This shouldn't ever occur.");
            }
            else if (isDeleted(refChange) || isCreated(refChange)) {
                branchCreation(refChange, event.getRepository(), commitList);
            }
            else {
                sepCommits.findCommitInfo(refChange, event.getRepository(), commitList);
            }
        }
        else {
            LOGGER.info("This type of refChange is not supported.\n refId={} fromHash={} toHash={} type={}", refChange.getRefId(), refChange.getFromHash(),
                    refChange.getToHash(), refChange.getType());
        }
    }
    return commitList;
}

我写的测试应该失败。 refID 是refs/heads/foo,它应该调用我正在测试的方法,永远不应该调用。但是,当我运行这个测试时,它以优异的成绩通过了。我在哪里搞砸了?

是的,我知道 PowerMockito 可以模拟构造函数,我制作了简单的makeArrayList() 方法来快速编写这个单元测试。

【问题讨论】:

  • 请发布整个课程。我看到的是你从来没有从测试中设置类字段

标签: java unit-testing mockito


【解决方案1】:

您正在测试您已模拟的 sepRefChangeEvent 上的方法调用,并且模拟对象在没有 when...then 或 do...when 指令的情况下什么也不做。

如果你想模拟一些方法但测试其他方法的真实实现,你应该使用 Mockito.spy 而不是模拟 SEPRefChangeEvent 的对象。

有很多方法可以实现它,但您需要确保您测试的是真实方法而不是模拟版本。

选择包括:

  • 将模拟注入真正的测试主题
  • 对测试对象使用间谍
  • 使用 when(...).thenCallRealMethod()。

该方法将取决于您正在测试的过程的复杂性。

【讨论】:

  • 是否可以模拟构造函数所需的所有项目并调用构造函数来创建真正的 SEPRefChangeEvent 对象?
  • 是的,有很多方法可以接近它,但您需要确保您测试的是真实方法而不是模拟版本。选择包括 1. 将模拟注入真实的测试主题 2. 使用间谍 3. 使用 when(...).thenCallRealMethod()。该方法将取决于您正在测试的过程的复杂性。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2019-08-07
  • 2018-07-24
  • 1970-01-01
  • 2017-08-31
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多