【问题标题】:Accessing private field of interface inside abstract test class访问抽象测试类中接口的私有字段
【发布时间】:2018-10-24 19:22:01
【问题描述】:

我有一个抽象基测试类和一个接口。在测试类内部,声明了一个接口类型的私有字段。

abstract class FibonacciTest {
  *private FibonacciImplementation fibonacciImplementation;*

   public FibonacciImplementation getImplementation(){
       return this.fibonacciImplementation;
   }
   protected void setImplementation(FibonacciImplementation fibimplem){
       this.fibonacciImplementation = fibimplem;
   }
  abstract void createFibonacciImplementation();

  @BeforeEach
  void createImplementation(){
    createFibonacciImplementation();
  }

  @Test
  void invalidPosition(){
    assertEquals(new BigInteger("-2"),
      fibonacciImplementation.calculateFib(-2));
  }

界面是:

public interface FibonacciImplementation {
  BigInteger calculateFib(int position);
}

基础测试类的子测试类是这样的:

public class RecursiveFibonacciTest extends FibonacciTest{

  @BeforeEach
  void createFibonacciImplementation(){
    fibonacciImplementation = new RecursiveFibonacciImplementation();* error is here
  }
}

递归斐波那契的实现是这样的:

public class RecursiveFibonacciImplementation implements FibonacciImplementation {

  @Override
  public BigInteger calculateFib(int position) {

    if(position < 0 )
      return new BigInteger("" + position);
    if(position == 1 || position == 0)
      return new BigInteger("1");

    return calculateFib(position-1).add(calculateFib(position-2));
  }
}

我遇到的问题是,在子测试类中,编译器抱怨我试图访问一个私有字段。 private FibonacciImplementation fibonacciImplementation; 字段。我如何删除该错误。如何访问fibonacciImplementation? getter 和 setter 似乎不起作用。编译器说fibonacciImplementation has private access in FibonacciTest

请注意,要求它必须是私有字段。

【问题讨论】:

  • 为什么一定要private
  • fibonacciImplementation标记为受保护,或提供setter方法。
  • 你为什么不在FibonacciTest. createImplementation中初始化fibonacciImplementation?就像这样fibonacciImplementation = createFibonacciImplementation()
  • @PM 这是作业的要求
  • @AndrewS 我在哪里放置 setter 方法?在基类内部?

标签: java unit-testing


【解决方案1】:

你真的需要一个字段吗?如果实现类的实例创建成本不高,您可以仅在需要时获取实例,无需将其存储在字段中。

abstract class FibonacciTest {

  abstract FibonacciImplementation createFibonacciImplementation();

  @Test
  void invalidPosition(){
    assertEquals(new BigInteger("-2"),
      createFibonacciImplementation().calculateFib(-2));
  }

}


public class RecursiveFibonacciTest extends FibonacciTest{

  @Override
  FibonacciImplementation createFibonacciImplementation(){
    return new RecursiveFibonacciImplementation();
  }

}

【讨论】:

    【解决方案2】:

    private 表示只能在同一个类中访问。如果您希望某个字段只能由子类访问,您需要将其标记为 protected

    改变这个:

    private FibonacciImplementation fibonacciImplementation;
    

    到这里:

    protected FibonacciImplementation fibonacciImplementation;
    

    FibonacciTest 类中。

    【讨论】:

    • 我无法保护它。作业的要求说我需要把它私有化
    猜你喜欢
    • 2015-03-07
    • 2014-06-19
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多