2014-03-29 2 views
4

나는 약 10 개월 동안 자바를 배웠다. 그래서 나는 그다지 경험이 없다. 개인적인 방법과 변수를 테스트하는 것이 얼마나 나쁜지에 대해 최근에 조금 읽었습니다.개인 변수 테스트 - 항상 나쁜 습관?

나쁜 디자인을 제안 할 때 완벽한 세상에서하지 말아야합니다. 그러나 대부분의 방법이 리플렉션을 통해 호출되고 나쁜 디자인 인 레거시 프레임 워크로 작업하고 있지만 무엇을 변경하지 않아도됩니다. . 프레임 워크의 작동 방식을 변경할 수 없으므로 "코드를 다시 디자인해야합니다"라고 대답하지 마십시오.

'flow'클래스가 특정 방식으로 동작하고 private 변수의 상태에 따라 올바른 메소드를 호출하는지 테스트하고 싶습니다. 특정 메소드가 private 인스턴스 변수를 올바른 값으로 설정했는지 확인하고 싶습니다. if 다른 개인 변수에는 특정 값이 있습니다. 클래스의 흐름/동작이 손상되거나 변경되지 않았 음을 보장 할 수있는 클래스에 대한 향후 변경 사항을 적용 할 때 그렇습니다.

이제 흐름은 개인 인스턴스 변수의 상태에 크게 좌우되기 때문에 개인 인스턴스 변수의 상태를 테스트하는 것이 좋지 않기 때문에 - 클래스를 테스트하려면 어떻게해야합니까? 모든 작업이 민간 변수를 테스트

방법 :

  1. 코드의 끝에 기본 액세스 getter 및 setter를 구현하고 같은 패키지에 JUnit 테스트 클래스를 넣어. 테스트에만 사용되어야한다는 점을 명확하게 설명하십시오.

  2. 인스턴스 변수를 개인용 대신 기본 액세스로 설정하고 junit 테스트 클래스를 동일한 패키지에 넣습니다. 같은 패키지 내의 다른 클래스는이 클래스를 인스턴스화하지 않습니다.

  3. 리플렉션을 통해 개인 변수 테스트 - 변수 이름을 변경하면 이클립스가 리팩터링하지 않으므로 여기 IDE 기능이 없어져 테스트 할 클래스의 변수 이름과 일치하도록 문자열을 수동으로 변경하는 것이 어려울 수 있습니다. .

위의 세 가지 중 어떤 것을 "덜"악마로 사용할 수 있습니까? 개인 변수를 테스트 한 후 전혀 테스트하지 않는 것이 더 낫습니까?

+1

개인 변수를 테스트해서는 안됩니다. 수업이 * 어떻게 *하는지 * 시험하십시오. – Bohemian

+0

가장 좋은 대답은 보헤미안 답을 선택했습니다. public 메소드를 호출 할 때 호출 될 순서대로 호출 한 다음 특정 메소드가 다른 메소드를 호출하는지 확인합니다. 필자가 테스트하기 전에 호출 된 public 메소드는 private 변수를 메소드가 다르게 작동하게하는 것으로 설정해야하며, 그 동작을 테스트 할 수 있습니다. 이것이 가져올 수있는 한 가지 단점은 특정 흐름의 비트에 메소드를 추가하려는 경우이를 반영하도록 테스트를 업데이트하고 해당 메소드를 호출해야한다는 것입니다. – DeaIss

답변

7

개인 필드의 상태는 클래스의 올바른 작동과 관련이 없습니다. 개인 변수를 테스트해서는 안됩니다.

클래스 이 아니고, 은 어떻게 수행합니까?을 테스트합니다.

클래스가 내부 상태를 올바르게 설정했는지 테스트하고 싶은 경우 클래스가 내부 상태를 올바르게 설정했는지 테스트하려는 경우 특정 방식으로 동작 한 다음 상태를 설정하는 메서드를 호출하고 올바르게 작동하는지 테스트합니다.

단위 테스트 일 뿐이므로 1000 시간의 테스트를 거치면 문제가되지 않으므로 빠릅니다.

미래의 코더는 수업의 계약이 유지되는 한 수업의 내부 작동을 자유롭게 변경할 수 있습니다.

+0

이 응답 이후에 내 코드를 볼 때 당면한 문제 중 하나는 내 메서드가 HTML 페이지에서 뭔가를 클릭 할 때까지 기다리고 메서드가 더 많은 작업을 수행하고 사용자가 일부 하드웨어와 상호 작용할 때까지 기다릴 수 있다는 것입니다. , 메소드는 좀 더 많은 것들을 수행한다. 이러한 사용자 응답을 조롱하는 것은 불가능하기 때문에, 내가 '모의'또는 흉내낼 수있는 유일한 방법은 사용자가 상호 작용할 경우 변경 될 개인 변수를 수정하는 것이다. 하드웨어 또는 html 페이지를 특정 방식으로 사용합니다. – DeaIss

+1

그런 다음 클래스를 깨뜨려 사용자 상호 작용을 추상화하여 모의하거나 모의하려고 힘들어보십시오. (실질적으로 모든 것이 조롱받을 수 있습니다!) – Bohemian

+0

정확히 무엇을하려고했으나 .... '표준'디자인 패턴으로 되돌아갑니다! 나는 당신이 말하려고하는 것을 얻는다 고 생각합니다. 예를 들어, happyday 플로우 (그리고 happyday 예상 순서)에서 호출 될 모든 메소드를 호출 한 다음 마지막 메소드 (보통 variableY가 true로 설정된 경우 보통 methodX를 호출하는 경우)를 호출 할 수 있습니다. happyday 흐름을 따라 가면) 나는 기대했던 것처럼 methodX를 호출합니다. 그렇게하면 개인 변수를 실제로 테스트하거나 설정할 필요가 없습니다. 그게 맞는 것 같니? – DeaIss

0

첫 번째 옵션은 좋은 선택입니다. 좋은 코딩 방법을 따르는 동안 변수를 수정할 수 없으며 외부 세계에서 메서드에 액세스 할 수 있도록 항상 변수를 전용 메서드 및 공용 메서드로 사용해야합니다.

관련 문제