2014-10-01 5 views
0

Я использую PowerMock для проверки статического вызова JavaCC в задаче Gradle.Использование измерительных приборов Gradle с PowerMock

В моей @Before аннотированный метод (я использую JUnit4 и Mockito, кстати), у меня есть это:

Project project = ProjectBuilder.builder().build(); 

При запуске любого тестового примера в этом классе с аннотацией

@RunWith(PowerMockRunner.class) 

я получаю следующее:

java.lang.NoClassDefFoundError: Could not initialize class org.gradle.testfixtures.internal.ProjectBuilderImpl 
at org.gradle.testfixtures.ProjectBuilder.<init>(ProjectBuilder.java:46) 
at org.gradle.testfixtures.ProjectBuilder.builder(ProjectBuilder.java:54) 
at ca.coglinc.gradle.plugins.javacc.CompileJavaccTaskTest.setUp(CompileJavaccTaskTest.java:43) 
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.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:132) 
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:95) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) 
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86) 
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) 
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33) 
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122) 
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104) 
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

Я думаю, что я пропускаю конфигурацию во время выполнения Gradle на моем тестовом пути к классам, но может не t найти, как исправить это. Удалив PowerMockRunner, мои тесты выполняются правильно, но тогда у меня не может быть теста, который зависит от PowerMock (я знаю, что материал должен тестироваться без использования PowerMock, но я не пишу JavaCC и все еще хочу проверить, что он вызван с некоторыми параметры). Есть идеи?

+0

Если это только для тестов Вероятно, вы должны добавить 'testCompile gradleApi()' в блок 'dependencies'. – Opal

+0

У меня уже есть 'compile gradleApi()', который, насколько я понимаю, также будет включать его в конфигурации testCompile и testRuntime. Доказательство того, что это работает, заключается в том, что мои тесты компилируются просто отлично. Тем не менее, я попробовал это на всякий случай, и он по-прежнему терпит неудачу с той же ошибкой. – johnmartel

+0

Есть еще одна вещь, которую я не понимаю: когда я запускаю «зависимости градиента», зависимости gradleApi вообще не отображаются при любой конфигурации. – johnmartel

ответ

2

Этот answer был на месте! Я не смог заставить PowerMockRunner работать с PojectBuilderImpl, но по крайней мере теперь я знаю, почему. Я попытался подавить статические инициализаторы, но тогда всевозможные вещи сломаны. Я, наконец, отказался от идеи модульного тестирования этой маленькой части моего кода и вместо этого полагаюсь на мои приемочные тесты.

Обратите внимание, что ответ Opal работает, но я не хочу добавлять useTestNG() в свой файл сборки, так как на самом деле я его не использую. Это кажется мне слишком противоречивым.

1

Вам нужно изменить <ROOT> /plugin/build.gradle, изменение:

test { 
    maxParallelForks = 10 
    forkEvery = 50 
} 

к:

test { 
    useTestNG() 
    maxParallelForks = 10 
    forkEvery = 50 
} 

Кажется, что TestNG следует использовать для запуска тестов.

+0

Я вообще не хочу использовать TestNG, я использую JUnit 4.4+ PowerMockRunner. Мой вопрос заключается в этой конфигурации, в частности, – johnmartel

+0

. Хорошо, мои тесты все еще проверяются JUnit, но добавление useTestNG() УДАЧИ ЗАДАЧА. У вас есть объяснение, что это необходимо для работы? – johnmartel

+0

Он знает, что это решает проблему, поэтому я представил ответ :) Что этот метод делает, так это переключение структуры, используемой с 'JUnit' на' TestNG'. Почему это помогает? Похоже, что 'PowerMockRunner' несовместим с' JUnit' - вот очень старая проблема: https://code.google.com/p/powermock/issues/detail?id=375, которая по-прежнему имеет статус * Accepted *. – Opal

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