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
相关产品推荐
相关产品推荐

