Giter Club home page Giter Club logo

android-unit-testing-tutorial's Introduction

创哥

目前就职于字节跳动(杭州),抖音部门。曾就职于小红书、蘑菇街、阿里、微策略、创新工场等众多公司。
曾自己创业,做过一个小程序,叫见证打卡团
工作主业是安卓开发,业余时间喜欢用Ruby on Rails写一些自己所用的小工具。

个人博客:https://chriszou.com/
公众号、视频号:小创作

处女座,非常重视代码质量,有代码洁癖。
觉得人活着,很重要的是要开心。所以很重视工作的开不开心,也会努力让团队成员也能工作的开心。

目前Focus在

抖音杭州部门很缺人,需要招大量的Android客户端开发同学。欢迎大家投简历,或私聊详情,在不泄密的情况下,我知无不言。

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

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);
    }

错别字

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

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

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

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

使用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);
}
}

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.