如何测试自定义sdk android单元测试的元素

时间:2017-12-13 10:35:22

标签: android unit-testing testing

我开始学习Android单元测试,但看起来很难找到一些好的指南或信息。每个例子都有一个关于2 + 2 = 4

的愚蠢的例子

假设我写了一个功能很少的SDK

MySdk.Init(Context context)
MySdk.CallTask()

我创建了一个androidTest文件

我应该如何调用我的SDK函数来检查它们的工作方式?某处需要参数,如int / string / context。我真的不明白,请帮助我。

这是我尝试过的

public class AndroidTest {
    private Activity context;


//default test
@Test
public void addition_correct() throws Exception {
    assertEquals(4, 2 + 2);
}

@Test
public void checkContext() {
    context = getActivity();
    assertNotNull(context);
}

@Test
public void testInitPhase() {

    MySdk.Init(context, new SdkInitializationListener() {
        @Override
        public void onInitializationSuccessful(String adv_id) {
            assert (adv_id != null);
        }

        @Override
        public void onInitializationError() {

        }
    });
}

}

对于上下文,我尝试了context = new mockContext();。它已作为context = null传递,我的SDK因初始化失败。

1 个答案:

答案 0 :(得分:2)

单元测试主要是单独测试单个类,以便您可以检查类的各个公共方法是否按照您的意图行事,如果您将来更改该类的代码,则继续这样做。假设你有这样一个类:

public class UtilityFunctions {
    public int double(int value) {
        return value * 2;
    }

    public String mirror(String value) {
         if (value == null) return "";
         return value + new StringBuilder(value).reverse().toString();
    }
}

您希望使用以下方法测试这两种方法:

  • 有效输入值,并检查输出是否符合预期
  • 无效值,并检查是否相应地处理了错误(并在必要时抛出了正确的异常)

因此上述类的测试类可能如下所示

@RunWith(JUnit4.class)
public class UtilityFunctionsTest {
    private UtilityFunctions utility;

    @Before
    public void setUp() {
        // Initialises any conditions before each test
        utility = new UtilityFunctions();
    }

    @Test
    public void testDoubleFunction() {
         assertEquals(2, utility.double(1));
         assertEquals(8, utility.double(4));
         assertEquals(-12, utility.double(-6));
         assertEquals(0, utility.double(0));
    }

    @Test
    public void testMirror() {
         assertEquals("", utility.mirror(null));
         assertEquals("", utility.mirror(""));
         assertEquals("aa", utility.mirror("a"));
         assertEquals("MirrorrorriM", utility.mirror("Mirror"));
    }
}

这些标准Java单元测试从test目录运行。但是,只要您使用 Android特定类(例如androidTest),就需要在Context目录中运行测试。如果您要创建MockContext,则只需创建一个空的Context,其方法不会执行任何操作。

如果我对MySDK的作用一无所知,我认为您可能需要将功能齐全的Context传递到您的班级进行测试。 Android JUnit运行器确实提供了InstrumentationRegistry.getTargetContext(),因此对于您的示例,您可能需要添加此@Before方法:

@Before
public void setUp() {
    context = InstrumentationRegistry.getTargetContext();
}

您还需要从第一次测试中删除context = getActivity();行。