Java的内部课程介绍

时间:2019-04-29 09:21:08

标签: java junit mockito

我目前正在为某个类(即内部类)中存在的类编写Junit。

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覆盖率报告的一部分。

3 个答案:

答案 0 :(得分:3)

另一个答案告诉您技术上如何到达:

  

有人可以指导我如何将UserRowMapper部分作为JUnit覆盖率报告的一部分。

...只需编写一个以某种方式运行的测试用例即可。

但是请注意:您是在问错误问题。您无需编写JUnit测试代码即可获得覆盖范围。您编写代码,以便您测试您的生产代码,以便在该代码错误时遇到错误,以便您以后可以更改生产代码,因为知道已经采取了一些措施 >验证,总体功能仍然正确。

换句话说:您应该问自己如何有意义地测试您的代码。像:该代码应做什么?存在哪些特殊情况?什么时候应该引发异常,等等。

然后编写涵盖所有这些方面的测试。

然后,最后,您可能希望收集覆盖率信息,以便了解从测试库中获得的覆盖率

含义:不执行任何断言或检查的单元测试只能使您达到100%的覆盖率,这种测试几乎是无用的。他们唯一告诉您的是:您可以像在单元测试中一样运行该代码,而不会弹出异常。

答案 1 :(得分:0)

大概您有一个工厂方法来创建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呢?

答案 2 :(得分:0)

如果要测试用mapRow方法编写的逻辑,则可以轻松创建实例并发送模拟结果集并验证参数

 MainClassJob mainClassJob = new MainClassJob();
  MainClassJob.UserRowMapper userRowMapper = mainClassJob.new UserRowMapper();
  userRowMapper.mapRow(mockResultSet,1)

但是,如果您的内部类不需要外部类中的任何成员,则意味着您应将其定义为静态类或,而应将其定义为完全独立的类。