2009-12-25 3 views
20

Я только начал использовать Eclipse, так что легко на меня;). Но при попытке отладки тест JUnit случае я получаю диалог, устанавливающая источник не найден, когда я получаю эту строку кода в моем методе испытаний:Eclipse отладка «источник не найден»

Assert.assertEquals(1, contents.size()); 

Я знаю, что я должен, вероятно, пойти и попробовать и загрузите источник откуда-то, но я действительно этого не хочу, потому что я не заинтересован в вступлении в код JUnit. У меня есть JUnit runtime jar so Почему Eclipse ожидает, что у меня будет весь исходный код ссылок, чтобы отладить мой собственный код (кажется, что-то глупо)?

Мой главный вопрос заключается в том, как я могу сказать Eclipse пропустить это диалоговое окно, когда источник недоступен, и разрешить мне продолжать отладку моего собственного кода?

[Редактировать]

Я выделил причину этого. Кажется, что Eclipse, похоже, считает, что ему нужен источник, когда исключение генерируется внутренним кодом JUnit. В общем, так или иначе, чтобы сказать, что это не так, и просто попробуйте вместо этого вызвать диалоговое окно с ошибкой?

+0

Я думаю, вы должны использовать «шаг за шагом» при навигации по методам junit, иначе Eclipse не имеет никакого способа, но предупредит вас, что нет источника. В этом случае вы можете продолжить «входить в» content.size(), но затем перед тем, как на самом деле ввести Assert.assertEquals, вместо этого нажмите «step over». – bryantsai

+0

Это именно то, что я делал - с помощью пошагового перехода (f6), и он по-прежнему выдавал этот код исходного кода, когда код JUnit выдавал исключение. – James

+0

Хмм, я не могу наблюдать за вашей ситуацией в среде Eclipse. Какую версию вы используете? Кроме того, вы используете внутреннюю библиотеку junit Eclipse или предоставляете внешний, собственный файл junit.jar? – bryantsai

ответ

20

У меня была эта очень неприятная проблема в течение долгого времени, но, наконец, она была в состоянии решить ее. В моем случае исключение нулевого указателя выбрасывалось где-то в функции Java Transformer.IsRuntimeCode (ProtectionDomain).

Мне не нужно было об этом знать, поскольку исключение было поймано и обработано, но eclipse приостанавливает отладку каждый раз, когда это происходит, и скажите, что источник недоступен. В результате мне постоянно приходилось нажимать кнопку, чтобы продолжить выполнение кода.

Для того, чтобы предотвратить это, я:

  1. Нажал на окне «Breakpoints» в нижней части отладки экрана
  2. правой щелкнул «NullPointerException»
  3. Неконтролируемый «Caught "

Это предотвратило отладчик от приостановки потока программы во время обнаруженного исключения NullPointerException.

alt text http://www.SharpDetail.com/p/so_breakpoint.gif

+0

Не работал для меня. –

1

Рассчитайте содержимое.size() на отдельной строке или установите контрольную точку для метода.

Также обратите внимание, что представление junit в Eclipse позволяет вам перемещаться по трассе стека.

10

Отладочный столбец отображает строку исходного кода JUnit при выдаче исключения.
Но вам не стоит беспокоиться об этом, если у вас нет исходного кода JUnit.

Если вы вернетесь в одну строку в callstack, вы должны увидеть строку (ваш исходный код), которая вызвала исключение JUnit.
Этого должно быть достаточно, чтобы отлаживать ваш код.


Чтобы связать источник с JUnit, вы можете добавить junit.jar в librairies вашего проекта, и ассоциирует junit-x.y.z-src.jar к junit-x.y.z.jar, like so:

http://web.archive.org/web/20130227201940/http://img241.i_mageshack.us/img241/1412/eclipsejunitsrc.png

Это будет генерировать в .classpath вашего проекта a a line like:

<classpathentry kind="lib" path="junit-x.y.z.jar" sourcepath="junit-x.y.z-src.jar"> 

Примечание: на самом деле, был бы полный путь к файлам junit[...].jar в этой строке classpathentry. Но вы также можете использовать Linked resources, чтобы избежать этого фиксированного значения (полный путь) в файле .classpath.

+0

Спасибо, это полезно, но это не решает проблему с Eclipse, и почему она считает, что ей нужно попросить источник. Я смог воспроизвести это же поведение с Hibernate, он выбросил внутреннее исключение, и снова Eclipse запрашивает источник. Я чувствую, что мне не хватает чего-то очень простого в моей конфигурации IDE. – James

+0

+1 для ваших усилий. Но как насчет следующей библиотеки, которую я использую? Предположим, у меня не всегда есть источник, то что? Кажется, что в IDE должно быть положение о том, что вы не попросите его, если этого не будет. – James

+0

@James: Я вижу вашу точку зрения и не думаю, что есть вариант затмения, чтобы сделать это * не * запрашивать источники. Но снова вам часто нужно сосредоточиться только на своем коде, а не на библиотеках, в которых у вас нет источников. Или у вас есть эти источники и можно легко связать их с указанными библиотеками. – VonC

2

У меня была аналогичная проблема. Я исправил его, щелкнув правой кнопкой мыши по папке проекта в проводнике пакетов и выбрав обновление. Источник кода не синхронизировался с отладчиком, и это исправило его. Сообщение Transformer.IsRuntimeCode (ProtectionDomain) Source not found больше не отображается.

0

У меня была аналогичная проблема с другой банкой, даже когда я указал на источник, она попросит ее снова. Я смог решить это, собрав банку с debug="on" на ANT.

1

Используйте фильтр шагов, чтобы избежать перехода через пакеты ... junit .... Щелкните правой кнопкой мыши на трассировке стека и выберите «Пакет фильтров». Возможно, вам придется сначала включить фильтрацию с помощью «Использовать фильтры шагов». ~~~

Смежные вопросы