2016-03-22 8 views
9

Я изо всех сил стараюсь получить эту редкую комбинацию, но мне не повезло. Мой проект использует JUnit + Mockito + Robolectric для тестирования и Roboguice для инъекций, когда я добавил PowerMock в уравнение странных вещей, это некоторые из вещей, которые я пробовал:Robolectric + PowerMock + Mockito не работает

1.- Из коробки PowerMock + Интеграция Mockito + Robolectic. Как было отмечено на PowerMockIngration, я добавил @PowerMockRunnerDelegate включить свой собственный бегун, который простирается от RobolectricGradleTestRunner:

build.gradle

testCompile 'org.powermock:powermock-module-junit4:1.6.4' 
    testCompile 'org.powermock:powermock-api-mockito:1.6.4' 

Тест

@RunWith(PowerMockRunner.class) 
@PowerMockRunnerDelegate(MyCustomRunner.class) 
@Config(constants = BuildConfig.class) 
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) 
@PrepareForTest(RoboGuice.class) 
public class Test { 

    @Before 
    public void setUp() throws Exception { 
    PowerMockito.mockStatic(RoboGuice.class); 
    .... 
    } 

Результат:

java.lang.IllegalArgumentException: Cannot subclass final class class roboguice.RoboGuice at org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:447) 
at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 
    at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217) 
    at org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378) 
    at org.mockito.cglib.proxy.Enhancer.createClass(Enhancer.java:318) 
    at org.powermock.api.mockito.repackaged.ClassImposterizer.createProxyClass(ClassImposterizer.java:123) 
    at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:57) 
    at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:111) 
    at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:59) 
    at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70) 
    at com.humana.vitalityapp.activity.BaseVitalityActivityTest.setUp(BaseVitalityActivityTest.java:79) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner$2.call(DelegatingPowerMockRunner.java:146) 
    at org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner$2.call(DelegatingPowerMockRunner.java:139) 
    at org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner.withContextClassLoader(DelegatingPowerMockRunner.java:130) 
    at org.powermock.modules.junit4.internal.impl.DelegatingPowerMockRunner.run(DelegatingPowerMockRunner.java:139) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)... 

Так выглядит @PrepareForTest и не работает, то я пытался, когда правило класс погрузчика, как это было предложено в том же руководстве:

build.gradle

testCompile 'org.powermock:powermock-module-junit4:1.6.4' 
    testCompile "org.powermock:powermock-module-junit4-rule:1.6.4" 
    testCompile 'org.powermock:powermock-api-mockito:1.6.4' 
    testCompile "org.powermock:powermock-classloading-xstream:1.6.4" 

испытаний Класс

@RunWith(PowerMockRunner.class) 
@PowerMockRunnerDelegate(MyCustomRunner.class) 
@Config(constants = BuildConfig.class) 
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) 
@PrepareForTest(RoboGuice.class) 
public class Test { 
    @Rule public PowerMockRule rule = new PowerMockRule(); 

@Before 
    public void setUp() throws Exception { 
    PowerMockito.mockStatic(RoboGuice.class); 
    ... 
    } 

На данный момент тест проходит, и я смог издеваться над RoboGuice, как и ожидалось, НО, когда я запускал все свои тестовые примеры вместе, я начинаю получать следующее исключение при создании простого макета, например mock(OtherClass.class):

org.mockito.exceptions.base.MockitoException: 
ClassCastException occurred while creating the mockito proxy : 
    class to mock : 'com.humana.vitalityapp.analytics.Analytics', loaded by classloader : '[email protected]' 
    created class : 'com.humana.vitalityapp.analytics.Analytics$$EnhancerByMockitoWithCGLIB$$67cb81b1', loaded by classloader : '[email protected]' 
    proxy instance class : 'com.humana.vitalityapp.analytics.Analytics$$EnhancerByMockitoWithCGLIB$$67cb81b1', loaded by classloader : '[email protected]764' 
    instance creation by : ObjenesisInstantiator 

You might experience classloading issues, disabling the Objenesis cache *might* help (see MockitoConfiguration) 

    at com.humana.vitalityapp.activity.BaseVitalityActivityTest.setUp(BaseVitalityActivityTest.java:77) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.powermock.modules.junit4.rule.PowerMockStatement$1.run(PowerMockRule.java:65) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 

Так что я попробовал много вариантов: Удалить класс Xtream погрузчик: JunitAgent

java.lang.RuntimeException: java.lang.ClassNotFoundException: org.powermock.classloading.DeepCloner 

    at org.powermock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:68) 
    at org.powermock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:34) 

Пользователь:

testCompile 'org.powermock:powermock-module-junit4:1.6.4' 
    testCompile "org.powermock:powermock-module-junit4-rule-agent:1.6.4" 
    testCompile 'org.powermock:powermock-api-mockito:1.6.4' 

Caused by: java.lang.IllegalStateException: PowerMockRule can only be used with the system classloader but was loaded by [email protected]f10 

Так что я бегу из идей, кто-нибудь ??

+0

Огромное усилие, чтобы эта настройка работала. К счастью, я не очень люблю PowerMock, поэтому я не использую его. К сожалению, я также не знаю, как заставить его работать. Рекомендуется ли тестировать вещи RoboGuice? –

+0

Ну, я только добавляю новый BaseActivity для своего проекта, потому что я обновляюсь, чтобы использовать AppCompat, поэтому моя новая деятельность простирается от него, и я пытаюсь внедрить все на нем, и его работа, я просто хотел проверьте этот класс, другой способ, которым я пытался, - это обернуть RoboGuice.getInjector в провайдере, таким образом, я мог бы проверить все, я просто пытался использовать PowerMock, чтобы избежать создания поставщиков для статического класса, так как форма меня потеряет преимущества статических методов. – JavierSP1209

+0

Можете ли вы попробовать порекомендовать путь? В этом случае вам не нужна powermock –

ответ

0

У меня была та же проблема.

Мое решение было:

  • удалить testCompile "org.powermock:powermock-module-junit4-rule-agent:x.x.x" из Gradle

  • изменение импорта статической * .Mockito.mock и * .Mockito.when к org.powermock.api.mockito.PowerMockito.mock и org.powermock.api.mockito.PowerMockito.when.

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

  • Нет связанных вопросов^_^