gpt4 book ai didi

java - 我怎样才能使 Java 方法对除测试之外的所有调用者都是私有(private)的?

转载 作者:行者123 更新时间:2023-11-28 20:02:49 25 4
gpt4 key购买 nike

我有一个 Java 类,它有一个私有(private)方法来计算一些默认值;和两个构造函数,其中一个忽略该值并使用私有(private)方法获取默认值。

public class C {
private static HelperABC getDefaultABC() {
return something; // this is a very complicated code
}

public C() {
return C(getDefaultABC());
}

public C(HelperABC abc) {
_abc = abc;
}
}

现在,我正在尝试为此类编写测试,并且想测试两个构造函数;第二个构造函数被传递默认值。

现在,如果 getDefaultABC() 是公开的,那将是微不足道的:

// We are inside class test_C
// Assume that test_obj_C() method correctly tests the object of class C
C obj1 = new C();
test_obj_C(obj1);

HelperABC abc = C.getDefaultABC();
C obj2 = new C(abc);
test_obj_C(obj2);

但是,由于 getDefaultABC() 是私有(private)的,我不能从测试类中调用它!!!

所以,我不得不写一些像这样愚蠢的东西:

// Assume that test_obj_C() method correctly tests the object of class C
C obj1 = new C();
test_obj_C(obj1);

// here we will insert 20 lines of code
// that are fully copied and pasted from C.getDefaultABC()
// - and if we ever change that method, the test breaks.
// In the end we end up with "HelperABC abc" variable
C obj2 = new C(abc);
test_obj_C(obj2);

除了简单地将方法从私有(private)更改为公共(public)之外,是否有任何方法可以解决这个难题(理想情况下,通过某种方式将 C.getDefaultABC() 标记为对除类 test_C 之外的所有人私有(private))?

最佳答案

There's no equivalent to friend in Java. (that link from T I above)我这样做的方法是像这样将方法声明为 protected 包:

static HelperABC getDefaultABC()

它的作用是允许您的测试代码调用 getDefaultABC(),只要测试类与 C 位于同一包中。当然,这也会让同一个包中的任何其他类也调用它,但我认为你将不得不忍受这一点,这是你在不使用反射的情况下所能做的最好的事情。但是,如果您使用反射,其他所有类也可以使用反射来调用 getDefaultABC(),因此它几乎是“易受攻击的”。我只是让它受到包保护,这样至少它比使用反射更具可读性。


我要让你从怀疑中获益,并说你可能继承了这段代码,而且它目前不可测试。您需要做的就是使 getDefaultABC() 进入可测试状态。测试甚至不必很好,你只需要一些信心。一旦您对测试有了一定的信心,您就会发现 getDefaultABC() 中的代码实际上与获取默认 ABC 无关。较低级别的抽象,例如连接到数据库或其他任何东西。您需要识别该代码并将其提取到它自己的类中。然后,为提取的类编写更好的测试。

如果您将此代码重构为真正干净的状态,您应该能够摆脱错误的测试并将 getDefaultABC() 放回其 private 状态. private 表示内部实现。您不应该直接测试内部实现。

关于java - 我怎样才能使 Java 方法对除测试之外的所有调用者都是私有(private)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17329105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com