Junit验证方法在失败时永远不会运行

时间:2016-08-12 21:25:43

标签: java unit-testing mockito

我有这个单元测试:

@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()方法快速编写单元测试。

1 个答案:

答案 0 :(得分:3)

你正在测试你已经模拟的sepRefChangeEvent上的一个方法调用,并且没有一个when ... then或者当...指令时,模拟对象什么都不做。

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

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

选择包括:

  • 将模拟注入真实的测试子工作站
  • 在测试主题上使用间谍
  • 在(...)。thenCallRealMethod()时使用。

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