如何正确编写VPartnerExtMapper的单元测试?现有代码需优化
测试代码问题分析与修正
原测试存在的问题
- 注解与手动mock冲突:类上声明了
@Mock ResultSet resultSet,但测试方法里又手动mock(ResultSet.class)创建局部对象,同时未初始化@Mock的ctx,运行时会抛出空指针异常。 - 字段获取方式不匹配:原Mapper是通过**索引位置(1、2、3、4)**读取ResultSet,而测试里用了列名
"NAME",导致映射时无法获取对应值,最终name会是null。 - 测试覆盖不完整:只验证了
name字段,tecClient、partnerId、tecVersionNr三个核心字段未测试。 - 缺少Mockito初始化:未添加Mockito的初始化逻辑,@Mock注解的对象不会被实例化。
修正后的完整测试代码
import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.jdbi.v3.core.statement.StatementContext; import java.sql.ResultSet; import java.sql.SQLException; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class VPartnerExtMapperTest { @Mock private ResultSet resultSet; @Mock private StatementContext ctx; private VPartnerExtMapper mapper; @Before public void setUp() { mapper = new VPartnerExtMapper(); } @Test public void testMapAllFieldsCorrectly() throws SQLException { // 模拟ResultSet按索引返回对应值 when(resultSet.getLong(1)).thenReturn(100L); when(resultSet.getLong(2)).thenReturn(200L); when(resultSet.getLong(3)).thenReturn(300L); when(resultSet.getString(4)).thenReturn("Michael"); VPartnerExt result = mapper.map(resultSet, ctx); // 验证所有字段映射正确 assertEquals(100L, result.getTecClient()); assertEquals(200L, result.getPartnerId()); assertEquals(300L, result.getTecVersionNr()); assertEquals("Michael", result.getName()); } }
关键修正说明
- 统一使用Mockito注解:用
@RunWith(MockitoJUnitRunner.class)让Mockito自动初始化@Mock对象,避免手动mock的混乱。 - 匹配Mapper的索引读取逻辑:按照Mapper里的顺序,分别模拟
getLong(1)、getLong(2)、getLong(3)、getString(4)的返回值。 - 覆盖所有字段验证:添加对三个long类型字段的断言,确保映射逻辑完全正确。
- 提取初始化逻辑:用
@Before方法统一初始化Mapper,提升代码复用性。
内容的提问来源于stack exchange,提问作者tiuke
相关产品推荐
相关产品推荐

