Запуск тестов Eclipse Junit Plugin с использованием Junit 4.4 или более поздней версии - почему тесты не обнаруживаются? - PullRequest
23 голосов
/ 31 октября 2008

Мне нужно использовать JUnit 4.4 (или новее) в наборе тестов плагинов Eclipse, но я столкнулся со следующей проблемой:

Тесты не обнаруживаются при работе с пакетами junit 4.4 или 4.5 из springsource ( junit44 и junit45 ). Пакет org.junit4, который можно получить с помощью eclipse, поставляет junit 4.3 (по состоянию на Ganymead / Eclipse 3.4). Пакет org.junit4 работает , так как он идентифицирует и запускает тесты, но он не совместим с последними версиями JMock, и мне нужно использовать библиотеку-макет.

Вот пример теста:

package testingplugin;

import static org.junit.Assert.*;
import org.junit.Test;

public class ActivatorTest {
   @Test
   public final void testDoaddTest() {
      fail("Not yet implemented");
   }
}

При выполнении этого теста я получаю следующее исключение:

java.lang.Exception: No runnable methods
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:33)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
    at org.eclipse.pde.internal.junit.runtime.CoreTestApplication.run(CoreTestApplication.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.equinox.internal.app.EclipseAppContainer.callMethodWithException(EclipseAppContainer.java:574)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:195)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:382)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1212)

Однако, если я переключу зависимости проекта с com.springsource.org.junit на org.junit4, то тест запустится и завершится неудачей (как и ожидалось).

Я выполняю тест как тест плагина JUnit в Eclipse со следующими аргументами программы:

-os $ {target.os} -ws $ {target.ws} -arch $ {target.arch} -nl $ {target.nl}

Следующие плагины, выбранные во время запуска (выбраны мной, затем я использовал «добавить необходимые плагины», чтобы получить остальные зависимости):

Workspace:
   testingPlugin
Target Platform:
   com.springsource.org.hamcrest.core (1.1.0)
   com.springsource.org.junit (4.5.0)
   ....and a bunch of others... (nothing related to testing was auto-selected)

Вот мой MANIFEST.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestingPlugin Plug-in
Bundle-SymbolicName: testingPlugin
Bundle-Version: 1.0.0
Bundle-Activator: testingplugin.Activator
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: com.springsource.org.junit;bundle-version="4.5.0"

Переключение последней строки на:

Require-Bundle: org.junit4;bundle-version="4.3.1"

И обновление выбранных плагинов при запуске:

Workspace:
   testingPlugin
Target Platform:
   org.junit4 (4.3.1)
   ...bunches of auto-selected bundles... (again, nothing else test related)

Заставляет тест работать правильно (но с неверной версией junit).

Ответы [ 9 ]

4 голосов
/ 02 июня 2009

По моему опыту это происходит, если плагин, который содержит тесты плагинов, не зависит от junit. После добавления зависимости junit 4.4 в мой файл MANIFEST.MF ошибка исчезла, и все тесты были выполнены. Зависимость junit должна быть необязательной, поскольку плагину она обычно нужна только для тестового кода.

2 голосов
/ 11 декабря 2008

Я не могу проверить это сейчас, так как у меня нет удобной установки Eclipse 3.4, но я столкнулся с подобной проблемой некоторое время назад в (я думаю) IntelliJ IDEA 7.0.x, и обходной путь должен был явно укажите тестового бегуна.

С JUnit 4.5:

import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
public class ActivatorTest {
    //...
}

Если это не сработает, вы можете добиться большего успеха с org.junit.runners.BlockJUnit4ClassRunner

Для JUnit 4.4 я бы попробовал org.junit.internal.runners.JUnit4ClassRunner

РЕДАКТИРОВАТЬ: не слишком уверен в части com.springsource., поскольку я не использую Springsource. Из вашего вопроса кажется, что springsource переупаковывает JUnit под com.springsource.org.junit, но вы используете просто org.junit в своем коде, поэтому я буду придерживаться этого.

1 голос
/ 07 февраля 2009

У меня были некоторые похожие проблемы с звучанием в jMock, JUnit & Eclipse недавно , хотя, по общему признанию, не с плагином тестами.

Я не уверен, что это актуально, но у меня все работает со следующими версиями: -

  • JMock-2.5.1.jar
  • Hamcrest-ядро-1.1.jar
  • Hamcrest библиотека-1.1.jar
  • JMock-junit4-2.5.1.jar

Я также обнаружил, что мне нужно использовать JMock Test Runner , например: -

  import org.junit.Test;
  import org.junit.runner.RunWith;

  import org.jmock.Mockery;
  import org.jmock.Expectations;
  import org.jmock.integration.junit4.JUnit4Mockery;
  import org.jmock.integration.junit4.JMock;

  @RunWith(JMock.class)
  public class PublisherTest {

    Mockery context = new JUnit4Mockery();

    @Test 
    public void oneSubscriberReceivesAMessage() {
1 голос
/ 30 января 2009

Мне интересно, может ли вам понадобиться импортировать тег @Test из com.springsource.org.junit, а не из org.junit.

Volker

0 голосов
/ 21 мая 2009

Я думаю, что среда весеннего тестирования не совместима с junit 4.4 +

0 голосов
/ 21 мая 2009

@ RunWith (Suite.class) @SuiteClasses ({UserServiceTest.class, ABCServiceTest.class})

открытый класс AllTestSuite {

публичный статический набор тестов () {

     return new JUnit4TestAdapter(AllTestSuite .class);
 }

}

0 голосов
/ 25 ноября 2008

ActivatorTest необходимо расширить TestCase

0 голосов
/ 25 ноября 2008

Возможно, в вашем комплекте JUnit отсутствует запись в MANIFEST.MF:

Dynamic-Import-Package: *

Это обязательно для загрузки классов из других пакетов.

Bebbo

0 голосов
/ 04 ноября 2008

Я не знаю, какая это была версия JUnit, но для успешного поиска теста имя метода тестирования должно начинаться со слова " test ".

В новой версии вы можете просто пометить тест с @Test, для меня это работает в этой комбинации:

import static junit.framework.Assert.*;
...
@Test
    public void testDummy() throws Exception
...