You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit单元测试:如何Mock集合中的B对象,验证bMethod全被调用?

问题:JUnit测试无法验证B对象的bMethod调用次数

你当前的测试用例无法正常运行,核心原因是Mockito的verify方法只能作用于Mock/Spy对象,而你代码里用的是真实的new B()实例,Mockito无法追踪真实对象的方法调用情况。

修改后的测试用例

import org.junit.Test;
import org.mockito.Mockito;
import java.util.HashSet;
import java.util.Set;
import static org.mockito.Mockito.*;

public class ATest {
    @Test
    public void givenAWithBSet_whenAMethodIsCalled_thenCallBMethodOnAllBs() {
        // GIVEN 创建B的Mock实例并组装集合
        B mockB1 = Mockito.mock(B.class);
        B mockB2 = Mockito.mock(B.class);
        
        Set<B> bSet = new HashSet<>();
        bSet.add(mockB1);
        bSet.add(mockB2);
        
        A a = new A(bSet);

        // WHEN 调用aMethod
        a.aMethod();

        // THEN 验证每个Mock的bMethod被调用一次,且无多余交互
        bSet.forEach(b -> verify(b, times(1)).bMethod());
        bSet.forEach(Mockito::verifyNoMoreInteractions);
    }
}

关键说明

  • 用Mockito.mock(B.class)创建B的Mock对象,这类对象会被Mockito代理,能够追踪所有方法调用
  • 不需要关心bMethod的具体实现,Mock对象默认会返回空值/默认类型值,不影响测试逻辑
  • 如果你的测试类使用Mockito扩展注解,也可以用@Mock简化Mock对象创建:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.HashSet;
import java.util.Set;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
public class ATest {
    @Mock
    private B mockB1;
    @Mock
    private B mockB2;

    @Test
    public void givenAWithBSet_whenAMethodIsCalled_thenCallBMethodOnAllBs() {
        Set<B> bSet = new HashSet<>();
        bSet.add(mockB1);
        bSet.add(mockB2);
        
        A a = new A(bSet);
        a.aMethod();

        verify(mockB1, times(1)).bMethod();
        verify(mockB2, times(1)).bMethod();
        
        verifyNoMoreInteractions(mockB1, mockB2);
    }
}

内容的提问来源于stack exchange,提问作者Nivia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:00:53