Giter Club home page Giter Club logo

android-unit-testing-tutorial's Introduction

android-unit-testing-tutorial

Code project corresponding to a serials of tutorial posts for android unit testing

本文是一系列发表在我的个人博客,关于安卓单元测试的文章的实例代码。
代码与文章的对应关系如下:
Android单元测试: 首先,从是什么开始 代码和测试代码都在what子package下面
Android单元测试(三):JUnit单元测试框架的使用 代码和测试代码在junit子package下面
Android单元测试在蘑菇街支付金融部门的实践 代码和测试代码在groupshare子package下面
Android单元测试(四):Mock以及Mockito的使用 代码和测试代码在mockito子package下面
Android单元测试(五):依赖注入,将mock方便的用起来 代码和测试代码在di子package下面
Android单元测试(六):使用dagger2来做依赖注入,以及在单元测试中的应用 代码和测试代码在dagger2子package下面
安卓单元测试(八):Junit Rule的使用 代码和测试代码在junitrule子package下面
安卓单元测试(九):使用Mockito Annotation快速创建Mock 代码和测试代码在mockitoannotation子package下面
安卓单元测试(十):DaggerMock, 让Dagger2与单元测试的结合易如反掌 代码和测试代码在daggermock子package下面

android-unit-testing-tutorial's People

Contributors

chriszou avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-unit-testing-tutorial's Issues

使用Robolectric单元测试一直报错,应该怎么解决

android.view.InflateException: XML file build\intermediates\res\merged\debug\layout\activity_login.xml line #-1 (sorry, not yet implemented): Error inflating class EditText

at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
at com.sparxo.checkin.activity.LoginActivity.onCreate(LoginActivity.java:52)
at android.app.Activity.performCreate(Activity.java:5933)
at org.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:195)
at org.robolectric.util.ActivityController$1.run(ActivityController.java:122)
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:304)
at org.robolectric.shadows.CoreShadowsAdapter$2.runPaused(CoreShadowsAdapter.java:45)
at org.robolectric.util.ActivityController.create(ActivityController.java:118)
at org.robolectric.util.ActivityController.create(ActivityController.java:129)
at org.robolectric.util.ActivityController.setup(ActivityController.java:210)
at org.robolectric.Robolectric.setupActivity(Robolectric.java:46)
at com.sparxo.checkin.LoginActivityTest.testView(LoginActivityTest.java:22)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251)
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188)
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

Caused by: java.lang.NumberFormatException: For input string: "@0"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at com.android.internal.util.XmlUtils.convertValueToInt(XmlUtils.java:128)
at android.content.res.TypedArray.getInt(TypedArray.java:322)
at android.widget.TextView.constructor(TextView.java:1046)
at android.widget.TextView.(TextView.java)
at android.widget.EditText.(EditText.java)
at android.support.v7.widget.AppCompatEditText.(AppCompatEditText.java)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:108)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:972)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1030)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:725)
... 41 more

Process finished with exit code -1

@RunWith(RobolectricGradleTestRunner.class)
@config(constants = BuildConfig.class, sdk = 21)
public class LoginActivityTest {
@test
public void testView() {
LoginActivity activity = Robolectric.setupActivity(LoginActivity.class);
EditText email = (EditText) activity.findViewById(R.id.email);
Assert.assertNotNull(email);
}
}

RepoModelTest#testLoadRepos()加了ShadowLooper.runUiThreadTasksIncludingDelayedTasks()仍然一直在wait

参照https://stackoverflow.com/questions/38182672/robolectric-does-not-execute-runnable
https://stackoverflow.com/questions/18956117/robolectric-run-handler-post
在testLoadRepos()方法里加了ShadowLooper.runUiThreadTasksIncludingDelayedTasks(),或者其他类似方法,貌似也都无法让handler立即Post消息去执行onSuccess方法。不知道为什么?

    public void testLoadRepos() throws Exception {
        //Robolectric.flushForegroundThreadScheduler();

        RepoModel model = new RepoModel();
        final List<Repo> result = new ArrayList<>();
        final CountDownLatch latch = new CountDownLatch(1);
//        ShadowLooper.runUiThreadTasks();
//        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
      //  ShadowLooper.pauseMainLooper();

        model.loadRepos(new RepoCallback() {
            @Override
            public void onSuccess(List<Repo> repos) {
                result.addAll(repos);
                latch.countDown();
            }

            @Override
            public void onFailure(int code, String msg) {
                fail();
            }
        });
//        Robolectric.flushForegroundThreadScheduler();
//        ShadowLooper.runMainLooperOneTask();
//        ShadowLooper.runUiThreadTasks();
        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
        latch.await();
        assertEquals(1, result.size());
        latch.await(2, TimeUnit.SECONDS);
    }

异步单元测试运行走不到testLoadRepos()里面的callback

运行RepoModelTest,测试testLoadRepos()方法,发现它会一直在await,结束不了。后来加入log后发现代码没有走到callback的onSuccess里面,所以没有触发latch.countDown()。跟进去RepoModel里面发现是callback.onSuccess(repos)调用的问题,直接调用的话后面是能够运行到callback的onSuccess里面的;但是如果用mUiHandler.post()来调用的话就执行不到run()里面的内容了,这是为什么呢?

错别字

《Android单元测试: 首先,从是什么开始》
1、所以,写单元测试,就是给你的每个类的每个public方法写对于(应)的测试方法。

2、如果这是一句牢*的话,就放括号()里吧
因为AndroidStudio太智能了,经常我需要重命名单元测试的package的时候,AndroidStudio会把src的package也给重命名了。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.