Android + Powermock + Mockito + Ошибка сборки Maven с ClassNotFoundException - PullRequest
0 голосов
/ 25 октября 2011

У меня странная проблема со сборкой Powermock и mockito при использовании maven.Я могу отлично выполнить тесты с помощью ecllise (без использования maven).Но когда я пытаюсь запустить тест с maven из cli или на сервере сборки, я получаю следующее исключение:

Тесты по ошибке: Механизм теста: java.lang.ClassNotFoundException: org.mockito.internal.progres s.ThreadSafeMockingProgress

Мой модульный тест выглядит так:

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;

import java.io.IOException;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import android.util.Log;

import com.generic_io.concurrent.ResultReceiverCallableFactory;


@RunWith(PowerMockRunner.class)
@PrepareForTest({
    Log.class
})
public class TestPowerMockTest
{

    @Mock
    ResultReceiverCallableFactory callableFactory;

    @Before
    public void setUp() throws IOException
    {
        mockLogger();
    }


    private void mockLogger()
    {
        PowerMockito.mockStatic(Log.class);
        when(Log.d(anyString(), anyString())).thenAnswer(new Answer<Integer>()
        {

            @Override
            public Integer answer(final InvocationOnMock invocation) throws Throwable
            {
                final String tag = (String) invocation.getArguments()[0];
                final String msg = (String) invocation.getArguments()[1];
                System.out.println("[" + tag + "] " + msg);
                return 0;
            }
        });

    }


    @Test
    public void testPreconditions()
    {
        assertThat("ResultReceiverCallableFactory is null", callableFactory, is(notNullValue()));
    }
}

Мой pom.xml выглядит так:

<dependencies>
    <dependency>
      <groupId>com.google.android</groupId>
      <artifactId>android</artifactId>
      <version>2.2.1</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>com.generic_io</groupId>
      <artifactId>generic_io</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>jar</type>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>com.pivotallabs</groupId>
      <artifactId>robolectric</artifactId>
      <version>1.0-RC1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.2</version>
      <type>jar</type>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-api-mockito</artifactId>
      <version>1.4.9</version>
      <type>jar</type>
       <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-module-junit4</artifactId>
      <version>1.4.9</version>
      <type>jar</type>
       <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.8.5</version>
        <type>jar</type>
        <scope>test</scope>
    </dependency>

     <dependency>
      <groupId>net.sourceforge.cobertura</groupId>
      <artifactId>cobertura</artifactId>
      <version>1.9.4.1</version>
    </dependency>

  </dependencies>

При сборке из CLI я получаю следующую ошибку:

Tests in error:
  Test mechanism: java.lang.ClassNotFoundException: org.mockito.internal.progres
s.ThreadSafeMockingProgress

У кого-нибудь есть идея, почему я получаю эту ошибку?Помощь очень ценится ...

Ответы [ 3 ]

1 голос
/ 10 декабря 2012

Вам необходимо добавить Dexmaker к вашим зависимостям, как это:

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.9.5</version>
    </dependency>
    <dependency>
        <groupId>com.google.dexmaker</groupId>
        <artifactId>dexmaker</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.dexmaker</groupId>
        <artifactId>dexmaker-mockito</artifactId>
        <version>1.0</version>
    </dependency>

Однако я думаю, что он не работает с Powermock. Этот пост может помочь вам.

0 голосов
/ 31 октября 2011

На случай, если это кому-то случайно поможет, я получил ту же ошибку, закомментировав конфигурацию плагина Surefire.

У меня была такая же ошибка, я проанализировал пути к классам Eclipse / Maven, не обнаружил различий (кроме записей "/eclipse/configuration/org.eclipse.osgi/bundles/320/1/.cp/").

В моем случае я ранее отключил тестовое разветвление для плагина Surefire в POM (для устранения другой проблемы). Я подумал, что просто попробую это прокомментировать, и это снова заработало. Случайно, но я думал, что передам это.

Для полноты я закомментировал следующую конфигурацию:

<!--
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.7.2</version>
            <configuration>
                <forkMode>never</forkMode>
            </configuration>
        </plugin>
-->
0 голосов
/ 25 октября 2011

Ваша maven конфигурация выглядит правильно, кроме org.mockito.internal.progress.ThreadSafeMockingProgress, не должно отсутствовать.

Какую версию mockito вы видите при выполнении следующей команды?

mvn dependency:build-classpath -DincludeScope=test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...