Что лучше, отражение Java или расширение класса в тесте - PullRequest
0 голосов
/ 04 января 2019

Есть класс Java, для которого я пытаюсь написать тест JUnit.

Использование JaCoCo для мониторинга покрытия кода. Следовательно, нужно также вызывать приватные методы из тестового класса.

Для вызова основного метода и закрытых методов из тестового класса с использованием отражения Java.

Мой вопрос заключается в том, чтобы расширить основной класс (Пример) в тестовом классе или использовать отражение 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 голосов
/ 04 января 2019

В идеале вы должны реорганизовать код для извлечения private методов, которые нуждаются в собственном тестировании, в новые public методы в новых классах. Если функциональность требует отдельного теста, она часто квалифицируется как public.

Кроме использования отражения, вы можете изменить видимость этих методов на уровень по умолчанию, и они будут доступны для тестов в одном пакете.

public class Example { 

  Employee method1(String str) {
    ...
  }

  Employee method2(String str1) {
    ...
  }

}


public class ExampleTest { 

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

}
0 голосов
/ 04 января 2019

Не используйте рефлексию для проверки частных методов, лучше тестировать эти методы с помощью методов public .

Так что в этом случае используйте Example.main() для проверки основных методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...