Junit 测试的最佳实践是什么:public 具有数据库访问权限的方法,或制作私有方法 public

What is best practice with Junit test: public methods with DB access, or making private methods public

我正在使用 JunitTesting 测试一个看起来像下面示例的 class。

 public RandomObject MainMethod(int id) {
       RandomObject o = dBconn.getRandomObject(id);
       subMethod(o);

       //also calling other private methods here

       return o;

 }

 private subMethod(RandomObject o) {
        //Do something random here

 }

我有三个选择:

  1. 仅测试我的 MainMethod(),但随后我必须通过将 DB 值硬编码到我的测试中来访问 DB。
  2. 我可以避免测试 MainMethod() 而只测试 subMethod,但是我必须创建我的私有方法 public.
  3. 同时执行 1 和 2。

最佳做法是什么?

进行 JUnit 测试时的最佳做法是在与您正在测试的 class 相同的包下编写 JUnit 测试。如果这样做,您可以使您的方法保持 package 可见性并仍然对其进行测试。当未指定 privateprotectedpublic 等可见性修饰符时,包可见性是方法的默认可见性。

几个选项spring要考虑。

我曾参与过使用实用方法的项目,以便通过反射执行私有方法是首选。

在其他项目中,我看到某些开发人员将subMethod 的访问修饰符更改为protected。然后,在您的测试 class 中,定义一个内部 class 继承您正在测试的 class。然后这个外观可以定义一个 public 方法,你可以在你的测试中调用它。类似于:

private class RandomObjectFacade extends RandomObject {

    public void subMethodFacade(RandomObject o){
         super.subMethod(o);
    } 
}

这取决于你认为什么是最好的。无论您是想忍受反射的脆弱性/性能损失,还是对现有代码进行小的侵入性更改 - 更改访问修饰符可能不适合您的情况。