2

MavenによるAndroidテストプロジェクトをセットアップし、ここからの指示に従いました。基本的に、エミュレーターが認識されていても、テストプロジェクトをセットアップできましたが、(Eclipseで)mvn installを実行すると、Mavenでテストを実行できません。実行しようとすると、次のエラーが発生します。

失敗したテスト:warning(junit.framework.TestSuite $ 1):コンストラクターの例外:testPersistAndRead(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):コンストラクターの例外:testFileNotExists(java.lang .RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):コンストラクターの例外:testCreateFiles(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):コンストラクターの例外:testFilesExist(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):コンストラクターの例外:testAndroidTestCaseSetupProperly(java.lang.RuntimeException:Stub!(..)

surfireからの出力は、AndroidTestCaseにネストされていることを示しています。

junit.framework.AssertionFailedError:コンストラクターの例外:testPersistAndRead(java.lang.RuntimeException:Stub!at android.test.AndroidTestCase。(AndroidTestCase.java:5)[...]

これは私が実行しようとしているテストです。

public class PersistenceManagerTest extends AndroidTestCase {

    private final String FILENAME_PREFIX = "test.";

    protected void setUp() throws Exception {
        super.setUp();
        deleteInternalStorageFile();

        MockContentResolver resolver = new MockContentResolver();
        RenamingDelegatingContext renamingDelegatingContext = new RenamingDelegatingContext(new MockContext(), getContext(), FILENAME_PREFIX);
        Context context = new IsolatedContext(resolver, renamingDelegatingContext);

        setContext(context);
    }

    //AfterClass
    protected void tearDown() {
        deleteInternalStorageFile();
    }

    public void testPersistAndRead() throws IOException {
        String testData = "foobar";

        PersistenceManager.persist(testData, FileType.JSONDATA);

        String result = PersistenceManager.getFileData(FileType.JSONDATA);

        assertEquals(testData, result);
    }

    public void testFileNotExists()  {
        try {
            PersistenceManager.getFileData(FileType.JSONDATA);
            fail("PersistenceManager.getFileData should throw an exception!");
        } 
        catch (IOException e) {
            //expected
        }
    }

    public void testCreateFiles()  {
        try {
            PersistenceManager.createNewFiles();
        } 
        catch (IOException e) {
            fail("PersistenceManager.createNewFiles() threw an exception");
        }   
        try {
            PersistenceManager.getFileData(FileType.JSONDATA);
        } 
        catch (IOException e) {
            fail("PersistenceManager.getFileData should not throw an exception!");
        }
    }

    public void testFilesExist() throws IOException  {
        assertFalse(PersistenceManager.filesExist());

        PersistenceManager.createNewFiles();

        assertTrue(PersistenceManager.filesExist());
    }

    private void deleteInternalStorageFile() {
        getContext().deleteFile(PersistenceManager.JSONDATAFILE);
        getContext().deleteFile(PersistenceManager.TIMESTAMPFILE);
    }
}

...これはテストプロジェクトのpom.xmlです。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd'>
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.mydomain.android</groupId>
    <artifactId>myproject-androidtests</artifactId>
    <packaging>apk</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>Testproject</name>

    <properties>
        <platform.version>2.1.2</platform.version>
        <android.sdk.path>/opt/android-sdk-linux</android.sdk.path>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <android.device>emulator</android.device>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android</artifactId>
            <version>${platform.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android-test</artifactId>
            <version>${platform.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>net.mydomain.android</groupId>
            <artifactId>myartifact</artifactId>
            <type>apk</type>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>net.mydomain.android</groupId>
            <artifactId>myartifact</artifactId>
            <scope>provided</scope>
            <type>jar</type>
            <version>1.0-SNAPSHOT</version>
        </dependency>

    </dependencies>
    <build>
        <outputDirectory>bin/classes</outputDirectory>
        <testOutputDirectory>bin/test-classes</testOutputDirectory>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <version>3.1.1</version>
                <configuration>
                    <sdk>
                        <path>${android.sdk.path}</path>
                        <platform>7</platform>
                    </sdk>
                </configuration>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>
</project>

これが機能しない理由はありますか?

4

2 に答える 2

5

私はここで解決策を見つけました。

dtmilanoの答えは基本的に間違っていませんが、それが私のテストにとって何を意味するのかわかりませんでした。解決策は、インストルメンテーションテストをJUnitテストとして実行してはならないことをMavenに通知することです。したがって、インストルメンテーションテストはsrc / test / javaではなく、src / main/javaにある必要があります。代わりに、apkに含める必要があるため、デバイスにデプロイされ、実行がトリガーされます。

于 2012-11-04T09:41:04.273 に答える
3

Androidデバイスやエミュレーターではなく、ホストのJVMでテストを実行しようとしています。android.jarスタブのみが含まれているため、

java.lang.RuntimeException: Stub!(..)
于 2012-11-03T22:43:15.517 に答える