我目前正在为类中存在的类(即内部类)编写Junits。
public class MainClassJob {
public class UserRowMapper implements RowMapper<MyReport> {
@Override
public MyReport mapRow(ResultSet rs, int rowNum) throws SQLException {
MyReport r = new MyReport();
r.setDate(rs.getDate("CS_DATE"));
r.setFirstName(rs.getString("FNAME"));
r.setFirstName(rs.getString("LNAME"));
return r;
}
}
}
有人可以指导我如何将UserRowMapper部分作为JUnit覆盖报告的一部分。
另一个答案告诉你如何在技术上达到:
有人可以指导我如何将UserRowMapper部分作为JUnit覆盖报告的一部分。
。只需编写一个以某种方式运行该代码的测试用例。
但请注意:您问错了问题。您不会为了获得覆盖率而编写 JUnit 测试代码。您编写代码以便测试生产代码,以便在代码出错时出现故障,以便以后可以更改生产代码,知道有适当的步骤将验证整个功能是否仍然正确。
换句话说:你应该问问自己如何有意义地测试你的代码。比如:该代码应该做什么?存在哪些特殊情况?何时应引发异常,...等等。
然后,您编写涵盖所有这些方面的测试。
最后,您可能希望收集覆盖率信息,以便了解从测试基础中获得的覆盖率。
意思是:不做任何断言或检查的单元测试,只是为了让你达到100%的覆盖率而运行,这样的测试几乎是无用的。他们唯一告诉你的是:您可以按原样在单元测试中运行该代码,而不会弹出异常。
大概你有一个工厂方法来创建一个UserRowMapper
:
private MainClassJob job;
@BeforeEach
public void before() {
job = new MainClassJob(...);
}
@Test
public void mapRow() {
final UserRowMapper mapper = job.mapper();
final MyReport report = mapper.mapRow(...);
// verify the results...
}
如果没有,则使用job.new UserRowMapper()
实例化一个,尽管工厂方法更简洁、更直观。
也就是说,如果行映射器没有使用父类中的任何功能或成员(在您的示例中就是这种情况),为什么它不static
?
如果要测试用mapRow方法编写的逻辑,那么可以轻松创建实例并发送模拟结果集并验证参数
MainClassJob mainClassJob = new MainClassJob();
MainClassJob.UserRowMapper userRowMapper = mainClassJob.new UserRowMapper();
userRowMapper.mapRow(mockResultSet,1)
但是,如果内部类不需要外部类中的任何成员,则意味着应将其定义为静态类,或者应将其定义为完全独立的类。