2016-11-19 1 views
0

에 의해 equals 메소드 :조롱하는 방법 문자열 # 내가하는 방법은 문자열 비교가 포함되어 있습니다 PowerMockito

if (stringA.equals(stringB)) { ... } 

를 그리고 단위 테스트에서, 나는 시도 :

String stringA = PowerMockito.mock(String.class); 
String stringB = PowerMockito.mock(String.class); 
when(stringA.equals(stringB)).thenReturn(false); 

그러나 이것은 실제로 사실 반환합니다. 아무도 PowerMockito에 의해 String # equals 메소드를 조롱하는 법을 제게 말할 수 있습니까? 감사.

+1

왜 이렇게하고 싶은가요? –

+0

아마도 Mockito 그룹에 대한 토론 (https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/mockito/d25SPtJ4108/Bj1kbarjBAAJ)에서 문자열을 모의하려고하면 JDK가 손상 될 수 있음을 강조합니다. 내부 처리 방법에 대해 설명합니다. 그 스레드에 대한 철저한 설명은 없지만, 문자열 조롱을 시도 할 이유를 알 수는 없습니다 ... 아마도 잘못된 각도에서 문제를보고있을 것입니다. 이것에 대해 몇 가지 생각을 나눌 수 있습니까? – Morfic

+0

기록 : 나는이 질문에 대해 많은 것을 듣게 될 것입니다. 따라서 대답 중 하나가 받아 들일만큼 도움이되는지 생각해보십시오. – GhostCat

답변

0

자바 문자열이 최종 클래스, 따라서 당신은 내가이 일에 대한 이유를 다시 방문 할 @PrepareForTest(ClassWithFinal.class) https://github.com/jayway/powermock/wiki/mockfinal

처럼, 최종 전략을 조롱 사용해야합니다, 당신은 테스트 및하지 모의 핵심 자바 클래스를 리팩토링해야한다. 최종 방법을 조롱하는 하드는 사실 외에 Why is String class declared final in Java?

+0

고마워, 나는 그것이'PowerMockito.mock (String.class)'에서 이미 말했듯이 마지막 클래스라는 것을 알았다. –

+0

PowerMockito.mock (String.class)을 사용하기 전에 더 많은 설정이 필요합니다. 준비 할 필요가 있습니다. partialMocking을 시도해 볼 수도 있습니다. https://github.com/jayway/powermock/wiki/MockPartial – chifer

+0

예, 예 내 정적 클래스와 최종 클래스에 이미 @PrepareForTest가 있지만 작동하지 않습니다. –

2

; 특히 코어 클래스를 java.lang.String으로 조작하려고 할 때 특히 그렇습니다. 실제 여기 다른 점은 다른 성격입니다. 이 (가)으로 잘못 지정되어 테스트를 위해 String.equals()를 재정의했습니다.

간단히 말씀 : 당신의 논리는 두 개체를 비교에 의존하는 경우, 당신은 에 당신이 그 두 값의 적어도 하나의 주입 할 수있는 디자인으로 올라오고에 집중해야 - 대신를 조작하는 더러운 더러운 해킹을 사용하여 해당 equals 메서드의 내부!

그러나 PowerMockito가 (String.equals()) 메소드를 재정 의하여 테스트 할 수 있도록 설계해야한다고 생각되는 디자인이라면, 가장 가능성이 높습니다 : 먼저 테스트 할 수없는 코드를 작성하십시오.

따라서 "비 응답". 현재 접근 방식에서 뒤로 물러나면 videos을 작성하는 방법을 알아 보려면 테스트 가능 코드을 작성하십시오. 그런 다음 다시 돌아와 디자인을 재 작업하십시오.

너무 자주 사람들은 깨진 디자인을 만듭니다. PowerMock (ito)은 깨진 디자인의 결과를 "수정"하는 방법이라고 가정합니다. 너무 자주, 정확한 반대가 사실입니다. PowerMock (ito)이 필요하다고 생각되면 디자인을 다시 작성해야합니다.

관련 문제