Запуск тестов Eclipse Junit Plugin с Junit 4.4 или новее - почему тесты не обнаружены?
Мне нужно использовать 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 Plug-in Test в 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).
Ответы
Ответ 1
По моему опыту это происходит, если плагин, содержащий тесты плагина, не зависит от junit. После добавления зависимости junit 4.4 к моему файлу MANIFEST.MF ошибка исчезла, и все тесты были выполнены. Зависимость junit должна быть необязательной, поскольку плагин обычно нуждается только в этом для тестового кода.
Ответ 2
Я не могу проверить это прямо сейчас, так как у меня нет установки 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
EDIT: не слишком уверен в части com.springsource.
, поскольку я не использую Springsource. Из вашего вопроса кажется, что springsource переупаковывает JUnit под com.springsource.org.junit
, но вы используете только org.junit
в своем коде, поэтому я буду придерживаться этого.
Ответ 3
Мне интересно, нужно ли вам импортировать тег @Test из com.springsource.org.junit, а не из org.junit.
Фолькер
Ответ 4
У меня были некоторые похожие звуковые проблемы с 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() {
Ответ 5
Я не знаю, какая версия JUnit была, но чтобы успешно найти тест, имя метода тестирования должно начинаться со слова " test".
В новой версии вы можете просто отметить тест с помощью @Test,
для меня он работает в этой комбинации:
import static junit.framework.Assert.*;
...
@Test
public void testDummy() throws Exception
Ответ 6
Возможно, в вашем пакете JUnit отсутствует запись в файле MANIFEST.MF:
Динамический импорт-пакет: *
Это обязательное для загрузки классов из других пакетов.
Bebbo
Ответ 7
ActivatorTest необходимо расширить TestCase
Ответ 8
@RunWith (Suite.class)
@SuiteClasses ({UserServiceTest.class, ABCServiceTest.class})
открытый класс AllTestSuite {
public static Test suite() {
return new JUnit4TestAdapter(AllTestSuite .class);
}
}
Ответ 9
Я думаю, что среда тестирования spring не совместима с junit 4.4 +