【问题标题】:Simplest way to unit test an android library application?单元测试android库应用程序的最简单方法?
【发布时间】:2010-11-16 13:15:54
【问题描述】:

对不起,如果这是一个有点模糊的问题,但是我正在努力寻找一个关于如何使用 Android 进行单元测试(隔离测试)的单个 solid 示例......

这是我想要实现的示例:

// Some class
class Calculator
{
    public int Add(int a, int b) { return a+b; }
}


// Simple test
import org.junit.Assert;
import org.junit.Test;

class CalculatorTests
{
    @Test
    public void should_add_numbers_correctly()
    {
        Calculator calculator = new Calculator();
        int expectedResult = 5 + 5;
        int actualResult = calculator.Add(5,5);
        Assert.assertEqual(actualResult, expectedResult);
    }   
}

所以一个项目包含模型和逻辑,然后另一个项目包含对所述库的测试。没有前端或 UI,所以我想做的只是能够测试我的方法是否都可以独立工作。

【问题讨论】:

  • 只是以防它混淆其他人,看来要使用正常的 JUnit 样式测试 @Test 你必须在正常的 JVM 上进行测试,所以你基本上测试你的代码就像它是 J2SE 一样。但是,我无法使用的另一种方法是您在模拟器上运行测试,然后您需要替换大量 guff 并扩展类,因为它使用 Junit 3 而不是 4 运行...这个链接帮助我更好地理解它:daverog.wordpress.com/2009/12/14/…

标签: java android unit-testing


【解决方案1】:

只要您的“库”不包含对 Android SDK 中资源的任何引用,就没有比常规单元测试更多的东西了。在你的 Eclipse 工作区中,假设你有你的主项目MyAndroidLibProject,你只需创建一个新的 Java 项目(例如MyAndroidLibProjectUnitTests)。在这里,您在主项目中创建引用 Calculator 类的普通单元测试(只需确保将主项目添加到测试项目的构建路径中)。

您还可以在我之前问过自己的similar question 以及针对该问题的answer 中找到一些其他信息。

更新示例:

import static org.junit.Assert.*;
import org.junit.Test;

public class SemesterTest
{
    @Test
    public void aNewSemesterShouldHaveANegativeId()
    {
        Semester semester = new Semester(2010, SemesterType.FALL);
        assertEquals(-1, semester.getInternalId());
    }

    @Test
    public void toStringShouldPrintSemesterTypeAndYear()
    {
        Semester semester = new Semester(2010, SemesterType.FALL);
        assertEquals(SemesterType.FALL + " 2010", semester.toString());
    }

    @Test
    public void equalityShouldOnlyDependOnSemesterTypeAndYear()
    {
        Semester aSemester = new Semester(2010, SemesterType.FALL);
        aSemester.setInternalId(1);

        Semester anotherSemester = new Semester(2010, SemesterType.FALL);
        anotherSemester.setInternalId(2);

        assertEquals(aSemester, anotherSemester);
    }
}

以上是我自己的Semester类的测试(代表一个学期的简单数据类)。 Semester 位于我的 android 项目 MyMainProject 中(但该类本身不包含对 Android SDK 的任何引用)。 SemesterTest 位于我的测试项目 MyTestProject(一个普通的 Java 项目)中,MyMainProjectMyTestProject 在同一个工作区中(并且由于 SemesterTestSemester 具有相同的包名称,我也不需要任何特殊的导入语句来引用Semester)。 MyTestProject 也将 MyMainProject 添加到其构建路径中(junit.jar 也添加到构建路径中,但这会自动发生,至少在 Eclipse 中我认为是这样)。

如您所见,这不过是一个完全普通的单元测试(JUnit 4,刚刚提到它)。希望这会有所帮助。

【讨论】:

  • 我现在使用 IntelliJ X EAP,比起 Eclipse,更喜欢 IDE。尽管出于某种原因尝试使用上述代码似乎不起作用。将确保类路径等设置正确。
  • 它似乎也在抱怨我没有 AndroidManifest.xml 文件,IDE 没有为我创建该文件,据我所知,如果我只是使用库和测试,我不应该需要它,因为图书馆项目中没有活动或行动。无论如何,这是特定于 IDE 的,与手头的问题并没有真正的关系,如果我能解决这个问题并确保一切正常,那么我会将你标记为答案
  • @Grofit:我没有使用 IntelliJ 的经验,所以我不能在那里给你任何具体的建议。然而,这个工作的第一个先决条件是你要测试的项目已经设置好并且工作正常。另外,如果您给我几分钟的时间,我会用我自己项目中的单元测试的具体示例来更新我的答案,只是为了表明它没有什么特别之处。
  • 我仍然有问题,但我认为它与 IntelliJ 相关,您的回答对其他人来说已经足够简洁了,非常感谢您抽出宝贵时间提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多