2015-01-15 3 views
7

CSV에서 데이터베이스로 계약을 가져 오는 클래스가 있습니다.많은 개인 메서드가있는 Java 테스트 클래스

클래스 자체에는 가져 오기를 시작하는 공용 메서드가 하나만 있고 다른 메서드는 모두 비공개입니다 (클래스 자체 만 사용하고 논리를 보유하기 때문에).

Spock을 사용하여이 클래스에 대한 테스트를 시작했고 많은 개인 메서드가 있는데 어떻게 테스트해야합니까?

시험에 공개로 설정해야합니까? main 메서드 만 테스트하십시오. 공용 메서드입니까?

무엇이 가장 좋습니까?

+0

이러한 메소드에 대해 JUnit 테스트를 실행하려면 'public'이어야합니다. 어떤 문제로 인해 그렇게 할 수 있습니까? – Ascalonian

+1

이러한 개인 메서드를 public 대신 package 메서드로 만들면 테스트가 동일한 패키지에 있어야합니다. – Gus

+1

나는이 SO 게시물을 통해 읽는 것이 좋습니다. http://stackoverflow.com/questions/105007/should-i-test-private-methods-or-only-public-ones –

답변

11

이론적으로 개인 메서드는 궁극적으로 공용 메서드 중 하나에 사용되거나 그렇지 않으면 전혀 사용되지 않습니다. 따라서 일반적으로 테스트를 설정하여 공용 메서드를 필요한 컨텍스트로 호출하여 개인 메서드에 적합하도록합니다.

단위 테스트는 주로 컴파일 단위 (즉, 클래스)를 테스트하는 것입니다. 테스트 메소드를 직접 테스트 할 수는 있지만 public으로 만들어야합니다. 그러면 깨끗한 API를 사용하지 않아도됩니다.

그래서 공개 메소드를 테스트하여 모든 개인 메소드를 테스트하십시오. 개인용 메서드는 클래스의 내부 메커니즘이며 직접 테스트 할 필요가 없습니다.

+0

Thx, 나는 그렇게 시험 할 것이다! –

2

일부 사용자는 API (예 :. 공개 메소드) 만 테스트해야한다고 주장하는 사람들이 있습니다.

가능한 솔루션은 동일한 패키지의 클래스 만 해당 메서드에 액세스 할 수 있도록 private 패키지를 사용하는 것입니다.

개인적으로 개인적인 메서드는 테스트하지 않았으므로 예상대로 동작하는 공용 메서드에 중점을 둡니다. 사적인 방법이 너무 많은 체중을 짊어지면, 아마도 그렇게 할 것이므로 기능을 더 멀리 분리해야합니다.

0

클래스가 인터페이스를 구현하는 경우 테스트하려는 모든 메소드를 "공용"으로 만들 수 있지만 인터페이스에 추가하지는 마십시오. 이 경우 테스트에서는이 메소드에 액세스 할 수 있지만 src에서는 액세스 할 수 없습니다.

1

리플렉션을 사용하여이를 수행 할 수 있습니다. Method 클래스에는 private/protected/default로 선언 된 경우에도 호출 할 수있는 setAcessible (boolean) 메서드가 있습니다. 아래 예제를 참조하십시오 :

YourClass yourClassInstance = new YourClass(); 
Method yourMethod = YourClass.class.getDeclaredMethod("yourMethod", null); 
yourMethod.setAccessible(true); 
Object[] parameters = new Object[1]; 
parameters[0] = "A String parameter"; 
Object result = yourMethod.invoke(yourClassInstance, parameters); 
관련 문제