哪个更好,Java反射或在测试中扩展类

时间:2019-01-04 14:33:22

标签: java junit4

有一个我要为其编写JUnit测试的Java类。

使用JaCoCo监视代码覆盖率。因此,还需要从测试类中调用私有方法。

使用Java反射从测试类中调用main方法和private方法。

我的问题是在测试类中更好地扩展主类(示例),还是使用java反射来访问私有方法?目前,我正在使用以下反射。

在测试类中扩展Java类甚至是一个好习惯吗?
我是编写测试课的新手,因此是个问题。非常感谢您的帮助。

public class Example { 
    public static void main(String[] s) {
        method1();
        method2();
        ..........
    }

    private Employee method1(String str) {
        .........
    }

    private Employee method2(String str1) {
        .........
    }
}

public class ExampleTest { 
    @InjectMocks
    Example example;
    .....

    @Before
    public void setUp() {
        ........
    }
    @Test
    public void testMain() {    
        try {
            String[] addresses = new String[]{};
            Example loadSpy = spy(example);
            loadSpy.main(addresses);            
            assertTrue(Boolean.TRUE);           
        } catch (.. e) {
            .......
        }
        assertTrue(true);
    }
    @Test
    public void testMethod1() {
        try {           
            Method method = example.getClass().getDeclaredMethod("method1", String.class);
            method.setAccessible(true);
            method.invoke(example, "1111");         
        } catch (Exception e) {
            .....
        } 
        assertTrue(true);
    }

    @Test
    public void testMethod1() {
        try {           
            Method method = example.getClass().getDeclaredMethod("method2", String.class);
            method.setAccessible(true);
            method.invoke(example, "1111");         
         } catch (Exception e) {
            .....
         } 
         assertTrue(true);
    }
}

2 个答案:

答案 0 :(得分:5)

不要使用反射来测试 private 方法,最好通过使用 public 方法来测试这些方法。

因此,在这种情况下,请使用Example.main()测试基础方法。

答案 1 :(得分:1)

理想情况下,您将重构代码以提取需要自己测试的private方法到新类中的新public方法中。如果某个功能需要单独的测试,则通常可以将其视为public

除了使用反射之外,您还可以将这些方法的可见性更改为默认级别,并且同一包中的测试将可以使用它们。

public class Example { 

  Employee method1(String str) {
    ...
  }

  Employee method2(String str1) {
    ...
  }

}


public class ExampleTest { 

  @Test
  public void testMethod1() {
    new Example().method1(...);
  }   

}