2012-08-06 3 views
3

나는이처럼 보이는 방법을 말할 수 있습니다 호출합니다. parseFoo2는 parseFoo가 일부 작업을 완료하는 데 도움이되는 도우미 메서드입니다. parseFoo 메소드를 테스트하려고합니다. 나는 대중 방법을 테스트 할 수 있기 때문에 내가 인스턴스 메소드를 지정할 수있는 방법 같은 parseFoo2 동안 그 개인 메서드 호출의 반환 값을 지정할 수 있습니다 EasyMock에있는 사람이EasyMock에 기대 개인 방법은

EasyMock.createMock(...); 
anObject.expect(...).andReturn(...); 

와 개체에 대한이 호출,하지만 난 개인적인 방법으로 들어가서 내부의 구현을 테스트 할 필요가 없다.

감사합니다.

답변

7

이어야합니다. 개인 방법을 조롱하면 PowerMock.expectPrivate()을 사용할 수 있습니다. EasyMock은 개인적인 방법을 조롱 할 수 없습니다.

12

하지 마십시오. 좋은 단위 테스트의 핵심 요소 중 하나는 구현 세부 사항에 가능한 한 적게 의존해야한다는 것입니다. 개인 방법을 조롱하는 것은 정확하게 그 것이다.

왜? 이렇게하면 단위 테스트가 매우 약해질 수 있습니다. 일주일 만에이 코드로 돌아와서 parseFoo2 메소드가 실제로 필요없고 실제로 코드를 인라인하려는 상황을 고려해보십시오. 또는이 메소드를 두 개 이상의 작은 메소드로 분할하려고합니다. 모든 매우 유효한 리팩토링 사례 - 하지만 유닛 테스트가 중단됩니다!

그런 간단한 리팩토링을 할 때마다 단위 테스트를 쫓고 싶지는 않습니다. 따라서 개인적인 방법을 조롱하는 것은 나쁜 습관으로 간주됩니다.

+2

이 답변은 너무 절대적입니다. 개인적 방법에는 테제되어야하는 내부 계약이 없다는 철학적 관점이 필요합니다. 이 메소드가 클래스의 여러 위치에서 사용되면 메소드를 작동 패턴으로 유지해야한다는 점에서 공용 메소드와 같습니다. 또한 최상위 메소드를 테스트하는 2-3 개의 로직 경로가있는 여러 메소드 (모두 private)를 호출하는 메소드가 매우 복잡해집니다. 체크인 할 때 실패 할 복잡한 테스트보다 더 나쁜 것은 없습니다. :) 나는 종종 가끔 바리케이드에 예측 가능한 비용을 자주 선호한다. – Gus

+2

@Gus, 나는 동의하지 않는다. 실용적인 관점에서 보면, 세밀한 방법으로 개인 메소드를 테스트하면 코드를 쉽게 리팩토링 할 수 없게됩니다. 복잡성이 커지면 별도로 테스트해야하는 부분을 고려해야합니다. 이 경우 수업을 고려해야합니다. 필자는 철학적 관점에서 볼 때 클래스의 개인 섹션은 테스트해야하는 유닛이 아니라고 주장합니다. 구현 세부 사항이며 테스트는 내부 동작이 아닌 테스트중인 객체의 요구 사항을 반영해야합니다. – Vitaliy

+0

내부의 (개인적인) 논리를 조롱하는 것이 매우 복잡하고 테스트의 요점을 놓치는 경우와 같이 개인적인 방법을 조롱해야 할 때가 있습니다. 그러나 이러한 경우는 비교적 드물며 다른 설계 흐름을 가리 킵니다. 에 관계없이 OP의 사용 사례에는 해당하지 않습니다. – Vitaliy

0

EasyMock을 계속 사용하려는 경우, EasyMock을 변경하는 것이 사용자 (회사에서의 작업)에 의존하지 않으므로 리플렉션을 사용하여 메소드가 반환하는 개인 필드 또는 해당 개인 필드를 변경할 수 있습니다.

예를 들어 도우미 클래스에서 이러한 메서드를 사용할 수 있습니다. 필요에 따라 사용하십시오.

+0

이것을 작동시킬 수 있습니까? 지금까지 행운없이 여러 번 시도했습니다. – HardcoreBro

+0

제 경우에는 parseFoo2가 다른 클래스에 있었지만 그 클래스가 반환 한 내용을 수정해야했습니다. 결국 해당 클래스의 개인 정적 필드가 바뀌 었습니까? public static void helpMethodForStaticFiled (Class class, fieldName, Object fieldValue) { 필드 필드 = class.getDeclaredField (fieldName); field.setAccessible (true); field.set (null, fieldValue); field.setAccessible (false); } 그리고 MyClass 클래스에 개인 정적 MyField myField가 있으면 다음과 같이합니다. helpMethodForStaticFiled (MyClass.class, "myField", new MyField()); – dalvarezmartinez1

관련 문제