【问题标题】:How to write Junit Test Case for Inner Class that has private access specifier?如何为具有私有访问说明符的内部类编写 Junit 测试用例?
【发布时间】:2021-07-28 13:46:57
【问题描述】:

对于类似的答案,我已经看到了几个以前的答案。我仍然无法理解,因为我是新手。下面是我的代码
package com.kishore.junitTestCases.innerClasses;
public class OuterClass {
   String prefix = "Hello, ";

  private class InnerClasss {
     public String greet(String name) {
        return prefix+name;
     }
  }

  public String displayFromInnerClass() {
     InnerClasss inner = new InnerClasss();
     String greetText = inner.greet("Kishore");
     System.out.println(greetText);
     return greetText;
  }
}

是否可以在不更改上述代码中的任何内容的情况下编写 JunitTestCase?我正在使用 PowerMockito。这是我构建的一半测试用例。

package com.kishore.junitTestCases.innerClasses;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
public class OuterClassTest {

   OuterClass outerClass = new OuterClass();

   @Before
   public void setUp() {
       MockitoAnnotations.initMocks(this);
   }

   @Test
   public void displayFromInnerClassTest() throws Exception {
        

   }
}

注意:您还可以推荐一些最佳做法吗?谢谢。

【问题讨论】:

  • 您到底想测试什么?我们通常测试代码的公共接口以验证其行为。私有方法应该被传递测试。 --- “我正在使用 PowerMockito。” - 提醒一句:PowerMock 使用字节码操作。尽可能避免。
  • 当你有一些东西既想测试又不能用代码的编写方式进行测试时——这表明代码应该以不同的方式编写。这并不总是可行的,对于此类情况,可以使用 PowerMock,但需要将其视为最后的手段。
  • @Turing85 好的。 PowerMockito的使用,我会小心的。我想从上面的 OuterClass 测试 displayFromInnerClass 方法。
  • 你想测试 assertThat(new OuterClass().displayFromInnerClass()).isEqualTo("Hello, Kishore") 没有的什么?
  • 那么您应该将这些服务作为类的“可注入”依赖项(例如,通过构造函数或通过方法等传递)。在测试期间您将注入模拟,而在生产代码中您将注入真实对象。

标签: java junit mockito powermock powermockito


【解决方案1】:

你没有。

获得一个内部类的实例是可能的(如果它实现了一个包含您需要的所有方法的公共接口) - 请参阅Can PowerMock instantiate an inner class for test cases?。这样你就可以测试内部类方法了。

但是,据我所知,您不能在模拟内部类的同时测试外部类。内部类生命周期与外部类实例有内在联系,没有机制可以替代它。

您想突出您编写的代码中的一个问题 - 如果内部类方法的调用不是操作的内在部分,如果模拟内部类以测试外部类是有意义的 - 那么它应该不是私有内部类,它应该是注入依赖项,正是因为您可以单独模拟和测试它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-22
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多