gpt4 book ai didi

android - 测试一个使用 ActionBarSherlock 的项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:28:05 25 4
gpt4 key购买 nike

我的设置:

  • 图书馆项目:ActionBarSherlock
  • 项目
  • 测试项目

  • 我的项目将库项目链接为库项目。它编译并运行良好。

    现在我尝试使用普通的测试项目来测试我的应用程序。在 Eclipse 中运行测试非常完美。如果我尝试使用 ant 运行测试,测试项目甚至不会编译:
    [javac] LoginActivityTest.java:9: cannot access com.actionbarsherlock.app.SherlockActivity
    [javac] class file for com.actionbarsherlock.app.SherlockActivity not found
    [javac] public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
    [javac] ^
    [javac] LoginActivityTest.java:25: cannot find symbol

    通过 eclipse 构建工作完美,测试运行也很完美。

    如果我将库项目链接到我的测试项目,它会用 ant 编译,但测试会失败。
     [exec] Error in testSuiteConstructionFailed:
    [exec] java.lang.RuntimeException: Exception during suite construction
    [exec] at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:238)
    [exec] at java.lang.reflect.Method.invokeNative(Native Method)
    [exec] at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
    [exec] at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
    [exec] at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537)
    [exec] at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)
    [exec] Caused by: java.lang.reflect.InvocationTargetException
    [exec] at java.lang.reflect.Constructor.constructNative(Native Method)
    [exec] at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
    [exec] at android.test.suitebuilder.TestMethod.instantiateTest(TestMethod.java:87)
    [exec] at android.test.suitebuilder.TestMethod.createTest(TestMethod.java:73)
    [exec] at android.test.suitebuilder.TestSuiteBuilder.addTest(TestSuiteBuilder.java:262)
    [exec] at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:184)
    [exec] at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:371)
    [exec] at com.zutubi.android.junitreport.JUnitReportTestRunner.onCreate(JUnitReportTestRunner.java:90)
    [exec] at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3891)
    [exec] at android.app.ActivityThread.access$1300(ActivityThread.java:122)
    [exec] at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1184)
    [exec] at android.os.Handler.dispatchMessage(Handler.java:99)
    [exec] at android.os.Looper.loop(Looper.java:137)
    [exec] at android.app.ActivityThread.main(ActivityThread.java:4340)
    [exec] at java.lang.reflect.Method.invokeNative(Native Method)
    [exec] at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    [exec] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    [exec] at dalvik.system.NativeStart.main(Native Method)
    [exec] Caused by: java.lang.NoClassDefFoundError: com.myproject.android.app.activities.LoginActivity
    [exec] at com.myproject.android.app.test.LoginActivityTest.<init>(LoginActivityTest.java:18)
    [exec] ... 19 more

    我的测试课:
    public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {

    private LoginActivity mActivity;

    private EditText mTextUserName;

    private EditText mTextUserPassword;

    public LoginActivityTest() {
    // the super call is line 18 (see stack trace above)
    super("com.myproject.android.app.activities", LoginActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
    super.setUp();
    mActivity = getActivity();
    mTextUserName = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_username);
    mTextUserPassword = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_password);
    }

    public void testPreConditions() {
    assertTrue("Activity is null!", mActivity != null);
    }

    public void testLogin() throws Throwable {
    mActivity.runOnUiThread(new Runnable() {
    public void run() {
    mTextUserName.setText("username");
    mTextUserPassword.setText("password");
    }
    });
    sendKeys(KeyEvent.KEYCODE_ENTER);
    }
    }

    一些想法如何解决这个问题?

    更新:看起来 ant 构建/测试仍然是一团糟。根据这篇关于 testing a library project 的博客条目列出的 7 个问题中的大多数将在下一个 ADT 版本 (ADT r20) 中修复。

    最佳答案

    有很多关于使用 Library 的不同信息。自 ADT 17 以来的项目破坏/修复了所有内容(取决于您当前是否将头撞在办公 table 上)。

    首先请注意Library之间的区别和“图书馆”,其中Library是 Android 团队规定的名词。我也在使用 Referencing描述使用 Library 的项目的项目项目。

    即,A Referencing项目使用 Library项目。

    Library “图书馆”项目

    在正常的 Java 开发中,可以在 Eclipse 中链接项目,其中一个项目依赖于另一个项目的源代码。我相信这种方法具有使用库项目源作为引用项目源的效果。这意味着库项目源在编译引用项目时在范围内。库项目类与引用项目的类同时构建。

    在构建以供在大多数情况下使用时,这可以很好地工作,因为所有类都是构建然后打包在 JAR 或 WAR 或其他任何东西中的。

    图书馆项目

    Android 团队 Library 是库项目的一种竞争( 而非 混合搭配)方法。项目:

    一个标记为 Library 的 Android 项目项目将编译并将其源代码构建为 jar文件中的bin目录(在 clean/build 命令之后)。任意 Referencing项目自动导入此 jar并访问 Library项目功能。您可以通过查看 Java 库 Android Dependencies 来了解这种关系。在包资源管理器中。

    除了类依赖解析,资源也被直接引用并编译到 R.java Referencing 中的文件项目 gen目录。

    ADT给人们的设置带来了问题,因为它添加了对包含 引用的 jar 的“支持”。 Library 项目:

    前 ADT 17
    Library项目在其构建路径中添加了一个 jar。Referencing项目也可以将 jar 添加到自己的构建路径中。

    ADT 17 起

    Dealing With Dependencies

    ADT 17 后 Library动态引用自己的 jar 的项目开始表现得很奇怪。这不仅仅是在您的 Referencing 中包含相同的依赖引用的情况。项目以使 jar 在两个范围内都可见。这现在导致包含类的奇怪重复。

    不幸的是,只是从 Referencing 中删除了库。或 Library项目(所以只有一个链接存在)然后混淆了eclipse,它再也无法从项目范围内看到使用它的jar。

    要解决此问题,您需要放置 Library /libs 中的项目 jars目录 - 如果您的 jar 位于硬盘驱动器上的分散位置,这可能会给您带来麻烦。这些 jars 将自动在您的 Library 中使用。和 Referencing项目。

    因此,要超越 ADT 17:

  • 删除所有 jar 文件 不是 在当前项目范围内用作源(无论是您的 Library 还是 Referencing 项目)。
  • 从您的 Library 中删除任何“库”项目项目(而不是将它们编译成 jar )。
  • 从您的Library 中移除外部 jar 项目,将它们复制到 libs而是目录。
  • 关于android - 测试一个使用 ActionBarSherlock 的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10313385/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com