We may earn an affiliate commission when you visit our partners.
Petros Efthymiou

The TDD Masterclass by Petros Efthymiou.

Learn State-of-the-art Android development by building a real production app.

Are you following dozens of forums and articles and buying courses in order to move your development skills and career to the next level?

Read more

The TDD Masterclass by Petros Efthymiou.

Learn State-of-the-art Android development by building a real production app.

Are you following dozens of forums and articles and buying courses in order to move your development skills and career to the next level?

I am, too, but more often than not, after completing them, I realize that there is still a HUGE amount of work left to be done to connect all the pieces together and make them work on a real application. I found that even though a course was providing comprehensive knowledge on coroutines, it didn't mean that I knew how to integrate them with Retrofit, Live data, or Hilt. And because another course was extensive on Test Driven Development after completing it, I didn't know how to write an application with TDD using the latest Android tech stack.

After buying courses, reading articles & forums, and a couple of months of hands-on practice, I have finally learned how to combine Android 11 best development practices in an Android application.

I created this course to make the process easier for you. You are going to learn how to combine

  • Kotlin

  • Coroutines

  • Live Data

  • Kotlin Flow

  • Retrofit

  • Hilt

  • Jetpack Navigation

  • MVVM

And complete a real Android application purely on Outside-In Test Driven Development

You are going to learn how to write not flaky espresso tests in a real scenario with delays and HTTP calls, without using Thread.sleep(). After all we wouldn't be doing TDD without efficient & effective Espresso UI tests.

Why Me?

Even though I am new to Udemy, I am not new to the industry. I have been working as an Android engineer from junior to lead positions in ambitious startups & large multinational companies for about 8 years. Being a good engineer, though, doesn't automatically mean that you are a good Instructor as well.

In the past 5 years I have also discovered my passion for education and worked as a Software Instructor in several colleges and companies, including New York College, Hellenic American Union my current position is a Mobile Trainer in a Multinational company called Backbase, where I am training

  • The internal RnD engineers

  • The internal professional services engineers

  • External third-party integrators

In my lifetime, I have trained thousands of developers in classrooms, web conferences, and video courses.

Why is it important?

As we advance to more senior engineering levels, we realize that how we do things is equally important to get them done. The industry has started to realize that a serious software engineering company can no longer base its products on purely architectural and engineering practices.

I often say that there are 3 stages in the advancement of an engineer

  • In the first stage, he/she is a programmer. He is learning how to make things work, e.g., how to add buttons in an Android application and handle its click. But is not aware of the importance of doing things well. He or she cannot realize that a purely structured system is certain to backfire in the long run, and while everything initially seemed to be going well, "suddenly," it is impossible to work with this system anymore. New features are hard to add, and bugs very often slip to production code

  • In the second stage, having realized the past mistakes, the professional starts practicing and learning good engineering patterns. He or she starts exploring things like :

    • SOLID Principles

    • Design patterns

    • Clean architecture

    • Separation of concerns

    • Low coupling, High cohesion

    • Unit Testing

    and if is passionate and dedicated enough, manages to reach a more senior level, and is able to develop systems that can be successful not only in the short but also in the long run

  • The final stage is the Mastery. This stage is an ongoing process and doesn't ever end. After the engineer has a good understanding of the above practices, he realizes there is a huge room for improvement. He learns how to apply them and, most importantly, when they are not required, and simpler-junior level approaches are more beneficial for the specific project/situation. In other words, it is a constant effort to learn how to never

    • Under-Engineer

    • Or Over-Engineer.

    He or she also comes in touch with more advanced practises like Test Driven Development which takes quite a lot of effort to get a grasp and master it.

In this course, I will do my best to advance you on this path. I will offer you what I have learned on my journey, and I am also very open to learning from you. I am always available on the forums to support and discuss topics that you might have a different point of view, and this way, we can help each other on our endless road to Software Mastery.

Enroll now

What's inside

Learning objectives

  • Develop a state of the art android 11 application: kotlin, coroutines, di with hilt, jetpack navigation component, kotlin flow, mvvm
  • Develop an application purely with outside-in test driven development. we focus on producing a real production app with business logic and common ux patterns
  • Become a senior / architect android engineer and advance in your career
  • How to combine all the practises together instead of having to follow multiple articles and courses and spending weeks to combine the best practises together
  • Jump straight to the latest and greatest of android development

Syllabus

Introduction
Course Introduction
Course Explanation
By the end of this section we will develop our first system using Test Driven Development
Read more
Section Intro

Let's discuss what TDD is.

Advantages of TDD
Platform Independent
TDD Lifecycle

Let's touch base on what is a Test

Writing Our First Unit Test

The solution to the exercise

Please take 1 min to rate the Course

What characteristics make a Test valuable?

Let's discuss of all the different types of automated Tests

Discussing Google's suggested testing strategy

How many TDD types exist?

Pros & Cons of TDD types

Which is our favourite TDD flavour?

One additional step

The requirements of the first system that we are going to develop using outside-in TDD

In this video we are going to write our first failing acceptance test that validates the system behaviour

In this video we will complete the first inner TDD cycle

Let's write the second acceptance test for the second part of our desired system behaviour

In this video we are going through the whole Inner TDD cycle for the Car class.

In this video we are going through the while Inner TDD cycle for the Engine class

Finally we complete the whole implementation of our system and our Acceptance Test is passing !

What you learned regarding TDD?

Section Closing
By the end of this section we will develop our first system using Kotlin Coroutines, Structured Concurrency and Kotlin Flow

Let's discuss what problems do coroutines solve & why do we need them

Explaining 2 new operations, the Suspend & Resume

Let's see what happens in the background while we write straightforward sequential code

How do coroutines achieve Main Safety?

Let's discuss an important concept called structured concurrency

Let's see coroutines in practise !

Learning how to write unit tests for Coroutines

Reactive Programming with Kotlin Flow

Let's discuss the advantages of Kotlin Flow VS Rx

Let's get some hands on experience using Kotlin Flow

Let's see how can we unit Test a Kotlin Flow

In this video we are closing up the implementation of our example system

Coroutines Quiz
In this section we are going to develop A Minimum Viable Android Application using : Outside in TDD, Kotlin, Coroutines and Flow
Section Introduction

Let's discuss the basic principles that will enable us to deliver fast, high quality code

Let's discuss the requirements of our MVP Android application

We are going to use Mockoon in order to make a real Backend environment on our localhost

Please download the start application attached to this video

Our first acceptance test is passing !

Implementing the failing Acceptance test for our playlists list

Let's discuss an interesting concept that I like to call Minimum Viable architecture

Creating the user interface for our playlists feature

Implementing the Fragment

Finishing the development cycle for the view layer.

Writing the first red unit test for our ViewModel layer

Green: First VM Unit test

We are turning the second unit test of our VM Green!

Never forget to refactor both the production & the test code

It is very important to also test how our system is applying error handling

Starting the inner TDD cycle for the Playlist Repository

In this video we reach the Green state for the emitPlaylistsFromService Test!

Finishing with the repository layer, do not forget that we must also implement the error handling!

Exercise: Service

We are turning green the first desired behaviour of our Service Test

Green: Second Service Test

Let's complete the implementation of our service layer by testing the error handling

Wrapping up the Playlists Feature
By the end of this course we will refactor our application and apply Dependency Injection using Google Hilt library

Let's first make sure that we understand what dependency injection is

Let's discuss the advantages of using dependency injection in your project

Let's discuss Google's HILT DI library and why it is the best choice currently for an android application

Evaluating our situation and what dependency injection means to our project

Let's include the HILT library to our application

Let's learn the steps to perform dependency injection using the HILT library

In this video we are going to finish the HILT library integration

Let's test the behaviour of our application after integrating HILT

Dependency Injection Quiz
In this section we will make our application look like a real production app. We will learn how to apply business logic and common UX patterns such as loaders while fetching the data.

After demo-ing the application to our team we are receiving some improvements from our Product Owner

Starting off with the failing acceptance test for our improvement as always

Implementing the first part of our improvement

Correcting broken past behaviour and implementing the second failing acceptance Test.

Completed the whole implementation of the loader functionality

Writing the first failing acceptance first for our second improvement

Let's discuss what is the best way to add business logic inside our application

We need to refactor our system to make to map the PlaylistsRaw to Playlists before we proceed with our second improvement

We need to make sure that the repository is delegating the playlist mapping

Finished the repository implementation

Now let's focus on implementing the business logic with the mapper

Going through the rest of the TDD cycle for our mapper

Getting the green light for the second improvement

Bonus: Removing Thread Sleep From Espresso Tests
In this section we will learn how to use the Jetpack Navigation Component for our application Navigation. We will use the single Activity - multiple Fragments pattern

Let's discuss what the Jetpack Navigation is

Good to know

Know what's good
, what to watch for
, and possible dealbreakers
Focuses on Android 11, which ensures learners are developing for a modern mobile operating system and are learning skills that are directly applicable to current development practices
Emphasizes Test Driven Development (TDD), which is a valuable practice for writing robust and maintainable code and is highly sought after in professional software engineering environments
Covers Kotlin, Coroutines, and Jetpack, which are modern tools and libraries that are widely used in Android development and are essential for building high-quality applications
Includes Hilt for dependency injection, which simplifies the management of dependencies in Android applications and promotes cleaner, more testable code, aligning with industry best practices
Requires learners to download a start application, which may require them to have access to Android Studio and a suitable development environment set up on their local machines
Uses Mockoon to simulate a backend environment, which requires learners to install and configure Mockoon on their local machines, adding an extra step to the development process

Save this course

Save Android TDD Masterclass - Coroutines, Jetpack to your list so you can find it easily later:
Save

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in Android TDD Masterclass - Coroutines, Jetpack with these activities:
Review Kotlin Coroutines Fundamentals
Solidify your understanding of Kotlin Coroutines before diving into the course. This will make the more advanced concepts easier to grasp.
Browse courses on Kotlin Coroutines
Show steps
  • Read the official Kotlin Coroutines documentation.
  • Work through a basic Coroutines tutorial.
  • Write some simple programs using Coroutines.
Brush up on Test-Driven Development (TDD)
Revisit the core principles of TDD to prepare for the course's emphasis on outside-in TDD. This will help you follow along with the practical examples.
Browse courses on Test-Driven Development
Show steps
  • Review the red-green-refactor cycle.
  • Practice writing unit tests before implementation.
  • Reflect on the benefits of TDD.
Read 'Clean Architecture' by Robert C. Martin
Deepen your understanding of clean architecture principles. This will help you design more robust and maintainable Android applications.
View Clean Architecture on Amazon
Show steps
  • Read the book 'Clean Architecture'.
  • Take notes on key concepts.
  • Relate the concepts to Android development.
Four other activities
Expand to see all activities and additional details
Show all seven activities
Implement a Simple Android App with Coroutines and TDD
Practice using Coroutines and TDD in a small project. This will reinforce the concepts learned in the course and help you build confidence.
Show steps
  • Choose a simple app idea (e.g., a counter app).
  • Set up a new Android project with Kotlin and Coroutines.
  • Write unit tests before implementing each feature.
  • Use Coroutines for asynchronous operations.
Write a Blog Post on Hilt Dependency Injection
Solidify your understanding of Hilt by explaining it to others. This will force you to think critically about the concepts and identify any gaps in your knowledge.
Show steps
  • Research Hilt dependency injection in Android.
  • Outline the key concepts and benefits.
  • Write a clear and concise blog post.
  • Include code examples to illustrate the concepts.
Contribute to an Open Source Android Project
Apply your skills in a real-world setting by contributing to an open-source project. This will expose you to different coding styles and development workflows.
Show steps
  • Find an open-source Android project on GitHub.
  • Identify an issue or feature you can contribute to.
  • Fork the repository and create a new branch.
  • Implement the changes and submit a pull request.
Read 'Working Effectively with Legacy Code' by Michael Feathers
Learn techniques for refactoring and testing existing codebases. This will help you apply TDD principles to real-world projects with legacy code.
View Brutal Refactoring on Amazon
Show steps
  • Read the book 'Working Effectively with Legacy Code'.
  • Identify common patterns in legacy code.
  • Practice applying refactoring techniques.

Career center

Learners who complete Android TDD Masterclass - Coroutines, Jetpack will develop knowledge and skills that may be useful to these careers:
Android Engineer
An Android Engineer develops and maintains applications for Android devices. This role involves writing clean, testable, and efficient code, and this course provides direct experience by building a real application using modern Android development practices such as Kotlin, Coroutines, Hilt, Jetpack components, and MVVM. Additionally, the course's emphasis on Test Driven Development and writing effective Espresso tests is central to this role, as it ensures robust and reliable code. By following this course, one can build a foundation for developing high-quality Android applications.
Mobile Software Engineer
A Mobile Software Engineer is responsible for the development and maintenance of software for mobile devices. This course focuses on using many cutting-edge technologies, such as Kotlin, Coroutines, Hilt and Jetpack, to build an Android application. The course’s strong emphasis on Test Driven Development and writing effective UI tests ensures that graduates can write high-quality, reliable code. This practical experience is essential for a mobile software engineer looking to develop applications and advance in their career.
Mobile Application Developer
A Mobile Application Developer creates, tests, and maintains mobile applications for various platforms, including Android. This course helps a mobile application developer understand fundamental and advanced Android development concepts and apply them by using practical examples. The course uses Kotlin, Coroutines, Live Data, Kotlin Flow, Retrofit, Hilt, Jetpack Navigation, and MVVM. The focus on Test Driven Development will also help you create a robust application. This course will be a valuable asset to anyone who is involved in mobile application development.
Software Developer
A Software Developer designs, develops, and maintains software applications. This course helps software developers specializing in Android development build applications by combining current best practices, making them better software developers. The course emphasizes Test Driven Development and utilizes many technologies, including Kotlin, Coroutines, Jetpack Navigation, and Hilt. The practical experience of building an application will be a useful asset to anyone looking to advance their career in software development.
Application Architect
An Application Architect designs the structure of applications and ensures they meet business needs; this often involves making key technology choices. This course, having been crafted by an instructor with professional experience, provides insights into best practices and can help in designing a robust Android application. The course directly integrates various components such as Kotlin, Coroutines, Jetpack, and Hilt into a cohesive application. By combining these components using Test Driven Development, this course may be useful for an aspiring application architect who is looking for practical experience.
Mobile Team Lead
A Mobile Team Lead is responsible for overseeing the work of a team of mobile developers, ensuring projects are delivered on time and to a high standard. This course focuses on advanced Android development practices such as Kotlin, Coroutines, Jetpack, and Hilt, combined with Test Driven Development. It provides a holistic approach on combining different components and may be useful to a Mobile Team Lead to help provide training and direction to their team. The course might be useful to see how all of these components fit together in practice.
Software Architect
A Software Architect is responsible for making high-level design choices and establishing technical standards for a project. Learning from an experienced software instructor, this course helps one learn to combine different architectural components of Android and integrate them into a functional application. It focuses on Test Driven Development, and its instruction may be useful for software architects. By understanding and practicing these techniques, one can improve the robustness and quality of their software.
Technical Lead
A Technical Lead is responsible for guiding a team of developers, ensuring the quality of code and making technical decisions. This course focuses on modern Android development with Kotlin, Coroutines, and Jetpack, using Test Driven Development to enforce high code quality. The course teaches how to combine best practices to build a real production application. A technical lead may find this approach valuable when designing and overseeing the implementation of complex Android applications. The course may be useful to learn how to put together all of these components.
UI Developer
A UI developer specializes in creating user interfaces. While this course covers a broad range of Android development aspects, the focus on using Jetpack Navigation and building a real application provides a good base for understanding UI implementation within the context of modern Android architecture. Furthermore, the course’s emphasis on writing effective UI tests with Espresso directly addresses the need for high-quality, user-friendly interfaces. Those interested in UI development may find the course useful.
Software Consultant
A Software Consultant advises clients on software development strategies and best practices. This course may be useful for gaining hands-on experience with modern Android development, which can be used to provide insight to clients. The course teaches how to combine technologies such as Kotlin, Coroutines, Hilt and Jetpack as well as use Test Driven Development to deliver a robust application. The depth of material covered in this course might help a software consultant provide advice on modern Android projects.
Quality Assurance Engineer
A Quality Assurance Engineer is responsible for the testing and quality of software products. This course emphasizes Test Driven Development and the creation of effective Espresso UI tests. This approach to software development may be useful to a Quality Assurance Engineer, as the course focuses on practices that help discover and resolve problems. The course directly deals with testing strategies, and may be useful in helping an engineer understand how best to test software.
Technical Trainer
A Technical Trainer educates others on the use of different technologies. The creator of this course has extensive experience as a trainer, and this course can serve as a sample for creating technical training material. The course combines best practices and focuses on combining disparate technologies using Test Driven Development. The broad range of topics may be useful for understanding what material to focus on when designing training programs.
Solutions Architect
A Solutions Architect designs and implements technology solutions. This course focuses on integrating many Android technologies, such as Kotlin, Coroutines, and Hilt, using Test Driven Development. The course builds a real application and this method of teaching may be useful in designing robust mobile solutions. While a solutions architect works with many kinds of technology, the experience of combining different Android components may be useful for some solutions architects.
Full-Stack Developer
A Full Stack Developer works with both front-end and back-end technologies. This course focuses on Android development using Kotlin, Coroutines, Hilt, and Jetpack. Although it is primarily focused on the front-end, this course may still be helpful for those who want to gain an understanding of mobile development. The focus on Test Driven Development and building a complete application are practices that may be useful to a full stack developer.
DevOps Engineer
A DevOps Engineer works to improve the development and deployment process of software. This course, while focused on development practices may also be useful to a DevOps Engineer. This course describes how automated testing is crucial to the development process, and has a strong focus on Test Driven Development. Understanding the development lifecycle may be useful to a DevOps Engineer to understand how to integrate testing into the deployment pipeline.

Reading list

We've selected two books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in Android TDD Masterclass - Coroutines, Jetpack.
Provides a comprehensive overview of software architecture principles. It is useful for understanding the concepts behind building maintainable and testable applications. While not strictly Android-focused, the principles are directly applicable to the MVVM architecture used in the course. It provides a deeper understanding of the 'why' behind architectural decisions.
Provides strategies for working with existing codebases that may not have been written with TDD or clean architecture in mind. It is valuable for understanding how to introduce testing and refactoring into legacy projects. While not directly related to the course's focus on new development, it provides a broader perspective on software maintenance and evolution. This book is more valuable as additional reading than as a current reference.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Similar courses are unavailable at this time. Please try again later.
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2025 OpenCourser