如何编写JUnit测试用例测试Android中HashMap的clear方法
问题分析与解决方案
核心问题
你的测试代码存在两个关键问题:
- Mock对象未关联到被测试类:你mock了
HashMap,但这个mock对象和类A内部自己创建的someList是完全独立的两个实例。调用A的clearList方法时,操作的是A自己初始化的HashMap,而非你测试中mock的那个,所以verify会检测不到交互。 - 类A存在语法错误:
clearList方法里写的是somelist.clear(),但类中定义的变量名是someList(大小写不一致),这会导致编译错误,必须先修正。
修复步骤
1. 修正类A的代码
先修复变量名大小写问题,同时为了方便测试,推荐添加依赖注入的方式(构造方法或setter),让外部可以替换内部的Map实例:
class A { private Map<String, Object> someList; // 推荐:构造注入,明确依赖 public A(Map<String, Object> someList) { this.someList = someList; } // 兼容原有无参构造 public A() { this.someList = new HashMap<>(); } // 可选:setter注入 public void setSomeList(Map<String, Object> someList) { this.someList = someList; } void clearList() { // 修正变量名大小写 someList.clear(); } }
2. 修正测试代码
将mock的Map注入到类A的实例中,再调用clearList方法进行验证:
方案一:构造注入方式
import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Map; import static org.mockito.Mockito.verify; public class ATest { @Mock private Map<String, Object> mockMap; private A aInstance; @Before public void setUp() { MockitoAnnotations.initMocks(this); // 将mock对象通过构造方法注入A的实例 aInstance = new A(mockMap); } @Test public void testClearList() { // 调用被测试方法 aInstance.clearList(); // 验证mock对象的clear方法被调用 verify(mockMap).clear(); } }
方案二:Setter注入方式
如果不想修改构造方法,也可以用setter注入:
@Before public void setUp() { MockitoAnnotations.initMocks(this); aInstance = new A(); // 通过setter注入mock对象 aInstance.setSomeList(mockMap); } @Test public void testClearList() { aInstance.clearList(); verify(mockMap).clear(); }
方案三:反射注入(不推荐,仅用于无法修改类A的场景)
如果不能修改类A的结构,可通过反射强制替换内部的someList字段:
import java.lang.reflect.Field; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.HashMap; import java.util.Map; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; public class ATest { private Map<String, Object> mockMap; private A aInstance; @Before public void setUp() throws NoSuchFieldException, IllegalAccessException { mockMap = mock(HashMap.class); aInstance = new A(); // 通过反射获取并替换类A的someList字段 Field field = A.class.getDeclaredField("someList"); field.setAccessible(true); field.set(aInstance, mockMap); } @Test public void testClearList() { aInstance.clearList(); verify(mockMap).clear(); } }
关键总结
- 测试时必须确保mock对象与被测试类的实例产生关联,否则mock对象不会被实际调用
- 优先通过依赖注入(构造/setter)的方式设计类,让测试更优雅、可维护
- 先修复类中的语法错误,否则代码根本无法正常运行
内容的提问来源于stack exchange,提问作者stack Learner
相关产品推荐
相关产品推荐

