Android + Powermock + Mockito + Maven构建错误ClassNotFoundExcept



我在使用maven的powermock和mock时遇到了一个奇怪的构建问题。我可以在eclipse中完美地运行测试(不使用maven)。但是当我尝试从cli或构建服务器上运行maven测试时,我得到以下异常:

测试错误:测试机制:java.lang.ClassNotFoundException: org.mockito.internal. progresss.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

有人知道为什么我得到这个错误吗?

您需要像这样将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。这篇文章可以帮助你。

您的maven配置看起来是正确的,除了org.mockito.internal.progress.ThreadSafeMockingProgress,不应该丢失。

执行以下命令时,您看到的是哪个mock版本?

mvn dependency:build-classpath -DincludeScope=test

只是为了防止这随机帮助某人,我通过注释掉Surefire插件配置来解决相同的错误。

我有同样的错误,分析了Eclipse/Maven类路径,发现没有区别(除了"/Eclipse/configuration/org.eclipse.osgi/bundles/320/1/")。cp/"条目)。

在我的情况下,我以前在POM中禁用了Surefire插件的测试分支(以解决不同的问题)。我想我应该试着把它注释掉这样它就能正常工作了。随机的,但我想我应该把它传给别人。

为了完整,我注释掉的配置如下:

<!--
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.7.2</version>
            <configuration>
                <forkMode>never</forkMode>
            </configuration>
        </plugin>
-->

相关内容

  • 没有找到相关文章

最新更新