Java Junit验证方法在失败时从不运行
我有一个单元测试:Java Junit验证方法在失败时从不运行,java,unit-testing,mockito,Java,Unit Testing,Mockito,我有一个单元测试: @RunWith (MockitoJUnitRunner.class) public class RefChangEventTest { @Mock RefChange ref; @Mock SEPCommits sepCommits; @Mock SEPRefChangeEvent sepRefChangeEvent; @Mock RepositoryRefsChangedEvent refsChange
@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);
}
}
@RunWith(MockitoJUnitRunner.class)
公共类RefChangEventTest{
@嘲弄
ref改变ref;
@嘲弄
SEPCommits SEPCommits;
@嘲弄
seprefchangevent seprefchangevent;
@嘲弄
RepositoryRefsChangedEvent refsChangedEvent;
@嘲弄
仓库回购;
@试验
public void gitNotesAreIgnored()引发异常{
集合引用列表=新的数组列表(1);
ArrayList commitListMock=mock(ArrayList.class);
refList.add(ref);
当(refsChangedEvent.getRefChanges())。然后返回(refList);
当(refsChangedEvent.getRepository())。然后返回(repo);
when(ref.getRefId())。然后返回(“refs/heads/foo”);
当(sepRefChangeEvent.makeArrayList())。然后返回(commitListMock);
processEvent(refsChangedEvent);
验证(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;
}
public ArrayList makeArrayList(){
返回新的ArrayList();
}
@凌驾
公共列表processEvent(RepositoryRefsChangedEvent事件){
ArrayList commitList=makeArrayList();
for(RefChange RefChange:event.getRefChanges()){
LOGGER.info(“检查ref change refId={}fromHash={}toHash={}type={}”,refChange.getRefId(),refChange.getFromHash(),
refChange.getToHash(),refChange.getType();
if(refChange.getRefId().startsWith(REF_分支)){
if(refChange.getType()==RefChangeType.ADD&&isDeleted(refChange)){
info(“删除了一个不存在的引用。这不应该发生。”);
}
如果(已删除(参照更改)| |已创建(参照更改)){
branchCreation(refChange,event.getRepository(),commitList);
}
否则{
sepCommits.findCommitInfo(refChange,event.getRepository(),commitList);
}
}
否则{
LOGGER.info(“不支持这种类型的refChange。\n refId={}fromHash={}toHash={}type={}”,refChange.getRefId(),refChange.getFromHash(),
refChange.getToHash(),refChange.getType();
}
}
返回委托列表;
}
我写的测试应该不及格。refID是refs/heads/foo
,它应该调用我正在测试的方法,永远不要调用它。但是,当我运行这个测试时,它以优异的成绩通过了。我在哪里搞砸了
是的,我知道PowerMockito可以模拟构造函数,我制作了简单的
makeArrayList()
方法来快速编写这个单元测试 您正在测试对已模拟的sepRefChangeEvent的方法调用,模拟对象在没有when…then或do…when指令的情况下不会执行任何操作
如果要模拟某些方法,但测试其他方法的实际实现,则应在seprefchangevent的对象上使用Mockito.spy而不是mock
有很多方法可以实现它,但是您需要确保您测试的是真实的方法,而不是模拟的版本
这些选择包括:
- 将模拟注入到真实的测试主题中
- 在测试对象上使用间谍
- 当(…)时使用。然后调用RealMethod()李>
方法将取决于您正在测试的过程的复杂性。请发布整个课程。我看到的是,您从未从test中设置类字段。另一种方法是模拟构造函数所需的所有项并调用构造函数来创建真正的seprefchangevent对象吗?是的,有很多方法可以实现它,但您需要确保测试的是真正的方法,而不是模拟的版本。选择包括1。将模拟注入真实的测试主题2中。使用间谍3。当(…)时使用。然后调用RealMethod()。该方法将取决于您正在测试的过程的复杂性。