AndroidユニットテストがログにNoClassDefFoundErrorをスローする

Android Unit Test throws NoClassDefFoundError on Log


質問 written by Glorfindel @2019-08-16 05:18:18Z

: 6 : 3 : 5

Eclipseで単体テストプロジェクトを実行しようとすると、 java.lang.NoClassDefFoundError: android/util/Logエラーが発生します。

蒸留すると、私のテストコードは次のようになります。

package com.randomtype.yycparking;

import junit.framework.TestCase;
import android.util.Log;

public class StallTests extends TestCase {  
    public void setUp() {
        Log.v("HI", "Fail");
    }

    public void testShouldParseIdFromTitle() {
        assertTrue(true);
    }
}

そして、コードはLog.v呼び出しで例外をスローします。 通常、Androidプロジェクトを実行すると、 Log例外は発生しません。

完全なスタックトレース:

java.lang.NoClassDefFoundError: android/util/Log
    at com.randomtype.yycparking.StallTests.setUp(StallTests.java:11)
    at junit.framework.TestCase.runBare(TestCase.java:132)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:243)
    at junit.framework.TestSuite.run(TestSuite.java:238)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: android.util.Log
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 14 more

dtmilanoが指摘したように、ユニットテストをAndroid JUnit Testとして実行していませんでした。 どのように違いを伝えることができますか? 下の写真のようなものを探してください:

JUnitアイコンの横のスクリーンショット
(ソース: skitch.com

回答 1 written by Diego Torres Milano @2012-01-11 20:16:22Z
4

テストは別のAndroidテストプロジェクト( プロジェクト-> Androidツール->新しいAndroidプロジェクト )にあり、Android JUnitテストとして実行する必要があります( 実行-> Android JUnitテスト )。

コメント 1

うん-それは私がやっていることです。それでもエラーが発生します。

written by ギャビンミラー @2012-01-11 20:20:21Z

コメント 2

プロジェクトのプロパティを確認します(Javaビルドパス->ライブラリ)。Androidが存在することを確認します。

written by ディエゴトレスミラノ @2012-01-11 20:38:34Z

コメント 3

アンドロイド2.1があります

written by ギャビンミラー @2012-01-11 20:47:17Z

コメント 4

ちょっと待って!Android JUnit Testとして実行していません私は誤ってJUnit Testとして実行していましたJUnit Test

written by Miller @2012-01-11 21:00:19Z

コメント 5

これらのテストは何かを拡張する必要がありますか、それとも単にJUnit4テストにすることができますか?

written by IgorGanapolsky @2015-04-08 19:54:42Z

回答 2 written by ahsiu @2015-12-09 13:13:51Z
1
 android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}

参照http://tools.android.com/tech-docs/unit-testing-support#TOC-Method-...-not-mocked.-

私の問題を見つけました:build.gradleファイルに通知し、compileSdkVersionを23に設定し、targetSdkVersionと同じに設定する必要があります。

回答 3 written by Community @2017-05-23 12:09:56Z
0

ここで同じ間違い、他の理由...

私のテストクラスは匿名パッケージでしたが、AndroidManifest.xmlと矛盾していました。

<instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="micharg.nameanimalthing" />

[同じ回答をここに投稿]