我有这个单元测试:
@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()
方法快速编写单元测试。
答案 0 :(得分:3)
你正在测试你已经模拟的sepRefChangeEvent上的一个方法调用,并且没有一个when ... then或者当...指令时,模拟对象什么都不做。
如果你想模拟一些方法但是测试其他方法的真实实现,你应该在SEPRefChangeEvent的对象上使用Mockito.spy而不是mock。
有很多方法可以解决它,但您需要确保测试的是真正的方法,而不是模拟的版本。
选择包括:
该方法取决于您正在测试的过程的复杂程度。