2016-11-19 13 views
0

У меня есть метод содержит сравнение строк:Как издеваются Строка # равно метод, PowerMockito

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

А в тесте на единицу, я попробовал:

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

Но это было на самом деле возвращает истину. Может ли кто-нибудь сказать мне, как высмеивать метод String # equals от PowerMockito? Благодарю.

+1

Почему вы думаете, что хотите сделать это? –

+0

Возможно, полезно [обсуждение группы Mockito] (https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/mockito/d25SPtJ4108/Bj1kbarjBAAJ), подчеркнув, что попытка фальсификации строк может сломать ваш JDK, потому что о том, как они обрабатываются внутри страны. На этом потоке нет исчерпывающего объяснения, однако я не могу понять причину, чтобы попытаться насмехаться над строками ... Возможно, вы смотрите на свою проблему с неправильного угла. Можете ли вы поделиться некоторыми мыслями по этому поводу? – Morfic

+0

Для справки: я сомневаюсь, что вы когда-нибудь услышите еще многое по этому вопросу, поэтому, пожалуйста, подумайте, достаточно ли один из ответов для принятия. – GhostCat

ответ

0

Java строка является конечным классом, следовательно, вы должны использовать насмешливый окончательные стратегии, как @PrepareForTest(ClassWithFinal.class) https://github.com/jayway/powermock/wiki/mockfinal

Я хотел бы вернуться причиной для этого, вы должны реорганизовать тест, а не имитировало основные классы Java. 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; real пункт здесь имеет различный характер: это просто неправильный для переопределения String.equals() для теста.

Просто говорят: если ваша логика опирается на сравнение двух объектов, то вы должны сосредоточиться на придумывая дизайн, который позволяет вводить по крайней мере один из этих двух значений - вместо использования грязных ухищрений, чтобы манипулировать внутренности соответствующего равного метода!

Но если ваш дизайн таков, что вы считаете, что вам нужен PowerMockito, чтобы сделать его проверяемым (путем переопределения методов String.equals()); скорее всего: вы просто создали untestable код в первую очередь.

Таким образом, мой «не-ответ». Шаг назад от вашего текущего подхода, проверьте эти videos, чтобы узнать, как написать testable код; затем вернитесь и переработайте свой дизайн.

Слишком часто люди создают broken дизайн; и тогда они предполагают, что PowerMock (ito) - это способ «исправить» последствия этого сломанного дизайна. И слишком часто, точное обратное верно: если вы считаете, что вам нужен PowerMock (ito), тогда ваш дизайн должен быть переработан.