我是使用Java中使用Mockito的Junit测试的新手。我被困在某一时刻。我有一个需要测试的抽象类摘要。如下所示。
public abstract class AbstractA implements ADao {
@Autowired
NamedParameterJdbcTemplate jdbcTemplate;
@Override
public List<String> getColumns(Set<String> ids) {
String sql = query();
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("ids", ids);
return jdbcTemplate.query(sql, paramMap, rowMapper());
}
abstract protected String query();
abstract protected AbstractIpRowMapper rowMapper();
}
和上述测试类是abacractatest
public class AbsractATest {
@InjectMocks
AbsractA abstractA;
@Mock
NamedParameterJdbcTemplate jdbcTemplate;
@Mock AbstractIpRowMapper abstractIpRowMapper;
@Before
public void setUp() throws IOException, SQLException {
abstractA=Mockito.mock(AbsractA.class, Mockito.CALLS_REAL_METHODS);
jdbcTemplate=mock(NamedParameterJdbcTemplate.class);
List<String> idsinput=new ArrayList<String>();
idsinput.add("123");
idsinput.add("124");
idsinput.add("125");
Set<String> ids=new LinkedHashSet<String>();
ids.add("123");
ids.add("124");
ids.add("125");
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("ids", ids);
String query="select ids from tableA where ids=:ids";
when(abstractA.query()).thenReturn(query);
when(jdbcTemplate.query(query, paramMap,rowMapper())).thenReturn(idsinput);
org.springframework.test.util.ReflectionTestUtils.setField(abstractA, "jdbcTemplate", jdbcTemplate);
}
protected AbstractIpRowMapper rowMapper() {
return absractIpRowmapper;
}
But after running this test case I am getting empty value for
abstractA.getColumns();
请帮助我了解我在上述情况下应该做什么。
运行docallrealmethod((。当(Abstracta(.getColumns((;在单元测试
您不需要测试抽象类 tdd 对抽象类别一无所知,使其成为正常类,并且只有两个或多个类都具有相同的代码重复将其提升为抽象,该课程的测试不会改变。将SQL查询字符串和IPROWMAPPER指定为构造函数参数,这简化了并使您的代码更加干净。其次,您不需要这样的复杂设置来进行测试,您只需验证交互,而不需要返回值,仅验证NamedParameterJdbcTemplate
模拟,什么值传递给了它。