【问题标题】:Mocking/stubbing private variables of a class without getter and setter methods在没有 getter 和 setter 方法的情况下模拟/存根类的私有变量
【发布时间】:2016-08-23 06:41:22
【问题描述】:

我最近开始为现有项目开发 TDD,遇到了几个问题,其中一个在下面提到

我有一个私有变量要在测试类中模拟,该变量如下所示

private Class<XYZ> cls = XYZ.class;

稍后这个“cls”变量被用作类名方法之一的参数

private List create(Class className, Object objectTO,   List<String> names)

我知道私有变量可以被模拟和 我按照以下步骤在我的测试用例中模拟了私有变量

  1. 声明了java.lang.reflect.Field;
  2. Field field = PowerMockito.field(XYZ.class,"cls");
  3. field.set(XYZ.class, "objectOfXYZClass");

当我运行我的测试类时,我遇到了错误

java.lang.IllegalArgumentException: Can not set java.lang.Class field com.tools.XYZ.cls to java.lang.Class
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75)
at java.lang.reflect.Field.set(Field.java:680)

请有人帮我解决这个问题,让我知道我缺少什么。

PS:我使用@preparefortest 并在其中提到了所有必需的类,并使用@runwith(powermockrunner.class) 运行我的测试类

【问题讨论】:

    标签: java mockito powermockito


    【解决方案1】:

    你得到错误的单元测试。它们不是关于测试内部实现(如字段或私有方法)。

    单元测试通常应该只做以下事情:

    1. 您创建了一个“被测类”对象
    2. 您在该对象上调用 public 方法;并且您对这些调用的结果“断言”(例如,这将包括期望此处或那里出现某些异常)。

    换句话说:您非常希望只测试“被测类”的外部可见行为。而且您知道:如果您的班级没有外部可见的行为 - 为什么您会比一开始有?!

    当然,有时这还不够“好”。在这种情况下,您通常会做的事情是:使用一些模拟框架(如 EasyMock 或 Mockito)来创建 mocked 对象。在实例化您的测试类时使用这些模拟(称为依赖注入)。通过这样做,您可以完全控制您的测试类;例如,您可以验证您的模拟是否看到您期望的那些方法调用。

    所以,长话短说:是的,有可能以某种方式访问​​被测类的字段。但这会导致单元测试不值这个名字。因为一旦您开始重构代码的内部结构,这些测试就会中断。从这个意义上说:此类测试仅有助于证明您当前的实现按预期工作。但是任何时候你改变一些东西,你将不得不重新工作(可能更大!)部分或你的测试代码。

    最后:编写单元测试是一项需要学习的技能。到达那里的最佳资源之一是videos

    【讨论】:

      【解决方案2】:
      field.set(instanceOfClassXYZ, "")
      

      放入集合,类的实例。不上课。因为您将字符串“objectOfXYZClass”设置为对象。不进入课堂;) 我会添加

      field.setAccessible(true);
      

      【讨论】:

      • @Sarseth..是的,这对我有用..我的错误,归档 .set () 我以其他方式做...非常感谢。
      猜你喜欢
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 2021-12-07
      • 2014-03-27
      • 1970-01-01
      • 2021-05-10
      • 2013-06-22
      • 1970-01-01
      相关资源
      最近更新 更多