Это видео недоступно.
Сожалеем об этом.

Spring Boot Testing Basics: How to Unit Test & Integration Test REST Controllers

Поделиться
HTML-код
  • Опубликовано: 8 мар 2020
  • In this tutorial, I want to discuss some basics of testing a rest controller in a Spring Boot application. This came up because of a tweet I sent out recently asking developers to stop calling a certain test a unit test. The reason I said this is because whenever you start involving Spring and the whole request & response lifecycle its no longer a unit test. In this demo, I will create a new Spring Boot application, create a simple rest controller and then show you how I would Unit & Integration test that controller. If anything this is just meant to spark a discussion so I would love to hear your thoughts on the subject.
    When you have completed this tutorial you should understand:
    ✅ Create a new Spring Boot Application
    ✅ Create a new Spring Boot Rest Controller
    ✅ Create a Unit Test
    ✅ Create an Integration Test
    ✅ Run a basic test in a Spring Boot Application
    ✅ How to use JUnit 5 in a Spring Boot Integration Test
    🔗Resources & Links mentioned in this video:
    Source Code: github.com/danvega/unit-vs-int
    Martin Fowler Unit Test: martinfowler.com/bliki/UnitTe...
    👋🏻Connect with me:
    Website: www.danvega.dev
    Twitter: / therealdanvega
    Github: github.com/danvega
    Instagram: / thedanvega
    LinkedIn: / danvega
    Coffee & Code: www.danvega/dev/newsletter
    SUBSCRIBE TO MY CHANNEL: bit.ly/2re4GH0 ❤️

Комментарии • 115

  • @DanVega
    @DanVega  4 года назад +10

    What is your definition of a Unit & Integration Test?

    • @Anbu_Sampath
      @Anbu_Sampath 4 года назад +4

      I agree with your definition of Unit and Integration Test. For Controller and Data layer, spring boot gives nice mock to test actual annotation and spin up minimal context. Because those layers we are not keeping much business logic.

    • @pvrsouza
      @pvrsouza 4 года назад +10

      I really never understood why using Unit Test on controllers. For each request a controller usually does a lot of steps like deserialize, validate, translate exceptions, etc its almost impossible do cover that on Unit Tests. IMHO, Unit Tests on controller (http layer) is just to verify business logic has been called and i can't see relevant value on it. Maybe i'm wrong but I really believe it's better build just Integration Tests for HTTP layer.

    • @Cassio81863636
      @Cassio81863636 3 года назад

      @@pvrsouza I agree with you. Usually in projects I work with, Controllers are only tested in Integration tests. and kinda solves coverage so

    • @handsome_man69
      @handsome_man69 Год назад +4

      There is no hard line between a Unit Test and an Integration Test. If you wanted a pure unit test then you would have to mock every external dependency, which would mean even mocking "String" objects. SUddenly It gets completely absurd. I have been in projects where they have written tests that are about 20 lines long, and that have tested exactly ONE line of code. The value of tests like this are next to ZERO. In my opinion unit tests are generally useless, unless you need to test complex algorithms or things like utils methods like DateUtils and that kind of thing. As soon as you start mocking too much you get tests which have no value. Integration Tests are much better because they more closely resemble Use Cases. As long as the performance/speed of these tests is good (TIP: use in memory databases!!!!! ), then you should focus on them over unit tests. Writing a test that goes from the RestController to the DB is excellent. It perfectly captures a Use Case. As long as the performance is fine..... do it like that!!!!!

    • @g.v.m7935
      @g.v.m7935 Год назад

      Isnt the @Test a spring notation? Refering to the start of the video where you said spring wasnt involved yet. Just out of curiosity so I know if I understand spring well enough in the basics.

  • @khalilgreenidge981
    @khalilgreenidge981 3 года назад +47

    I literally spent 5 hours trying to achieve this. At 2 am I found your video. Thank you so much!

    • @DanVega
      @DanVega  3 года назад +1

      Glad it helped!

  • @brianocorner5604
    @brianocorner5604 3 года назад +2

    WoW..!! Dan!!! Thanks for sharing an amazing tutorials and good explanation. It is 4:00am here. Thanks to you, my searching ends here.

  • @joshuaecht
    @joshuaecht 4 года назад

    CLEVELAND! Go Browns! :) This is a great vid. I went to We Can Code IT and we learned this, but it helps refresh my learning of Testing.

  • @teotsi21
    @teotsi21 4 года назад

    Great video, couldn't figure out the Integration Testing, thanks!

  • @saeidkazemi8480
    @saeidkazemi8480 3 года назад

    Thanks a millioooon for the great explanation and illustration

  • @haroonafridi1802
    @haroonafridi1802 2 года назад +1

    100% agree with your thoughts about unit testing and integration testing

  • @mateovansweevelt5257
    @mateovansweevelt5257 2 года назад

    What an absolute beautiful video man!

  • @shashidhar71
    @shashidhar71 3 года назад +11

    Your definition is right. Unit - Single entity.
    Integration - How it works with entire system.
    Imagine if you have missed @RestController annotation, unit will pass but int fails.

  • @muditshukla
    @muditshukla 2 года назад

    Great explanation. Thank you Dan

  • @arjungupta4672
    @arjungupta4672 3 года назад

    Quick and fast way to understand difference and learn 👍

  • @jacsdev
    @jacsdev 2 года назад

    thanks for sharing this kind of content!

  • @procrastinator24
    @procrastinator24 2 года назад +1

    Nice and clean explanation, thank you!

    • @DanVega
      @DanVega  Год назад

      Glad it was helpful!

  • @ChildrenOfDemiurgos
    @ChildrenOfDemiurgos Год назад

    Plain and simple. Thank you! Awesome if you could make a more in depth video about this.

  • @kaiser92600
    @kaiser92600 Год назад

    Thank you for your tuto, very good work

  • @manuellarrota
    @manuellarrota 3 года назад

    Gracias mi pana, muy bien explicado un abrazo!

  • @somtovitus
    @somtovitus Год назад

    this is beautiful, thank you

  • @stephaneislistening6103
    @stephaneislistening6103 2 месяца назад

    I could use this AutoConfigureMockMvc testing with your other Testcontainers you gave us in another video. Thanks Dan !

  • @catsbite3634
    @catsbite3634 2 года назад

    It’s 5:17 am and I found this. Thanks for ur video

  • @luvcode567
    @luvcode567 3 года назад

    Really nice one. It helps in understanding the between unit test and integration test. can you make more videos on integration test. Also looking for test using Mockito

  • @raphaelzamora7974
    @raphaelzamora7974 2 года назад

    thank you for this! I’m supposed to be writing a unit test before I move on to integration testing and it seems like I jumped the gun

  • @aceisastud
    @aceisastud 3 года назад

    Love this video BUT love the shirt even better! Go Browns! From a fellow Ohioan to another thanks for the videos!

    • @DanVega
      @DanVega  3 года назад

      OH- Thank you Chad! I actually made that shirt myself. I have a bunch of Browns shirts so I will try working them in.

  • @legacylifey182
    @legacylifey182 2 года назад +1

    Thank you so much!

  • @ABHISHEKMISHRA-ib5vo
    @ABHISHEKMISHRA-ib5vo 3 года назад

    Grear Dan! 😊

  • @taprandich
    @taprandich 3 года назад +1

    Thank so easy to understand would be nice if you advance this topic on the more complicated methods as well

  • @VISITLosAngeles
    @VISITLosAngeles 3 года назад

    Thank you so much sir :)

  • @Utub-qc2cz
    @Utub-qc2cz Год назад

    Thank you Dan for this content. Would you please share your experience with more advanced examples of integration tests using DdUnit ?

  • @FellTheSky
    @FellTheSky 3 года назад +1

    This is the best video about testing. Watched so many but yours let everything clear! (im junior)

    • @DanVega
      @DanVega  3 года назад

      Wow, thank you! That is a great compliment. Is there anything else in testing you would like me to cover? I should have a video on Spring Data Slice Testing coming out this week.

    • @FellTheSky
      @FellTheSky 3 года назад

      @@DanVega Well usually every video has details of how to create a rest controller or other types of controllers. I get that, but when you apply for a junior job, they assume you already know testing. Thats not the case.
      I have a controller that returns a DTO with this format: {"idUser":0,"email":null,"firstName":null,"lastName":null,"loans":null}(loans is a list)
      Well i have no idea of how to test it. Should i recreate the entire method in the test class? I dont think so because in that case whats the difference with just using postman.
      Maybe this sound dumb to you, but ive started to code 6 months ago, and right now im applying for spring junior dev (fintech). They want me to know: ORM, Spring Boot, SQL, Hibernate, GitHub, Maven, testing and logs.
      I think 1 minute at the end of the explanation quickly showing how to test it would be great, but i get it, thats a low of added work.

    • @batasheemum
      @batasheemum 3 года назад

      Dan Vega It would be great if you can do basic spring boot testing videos for junior automation testers/developers etc.

    • @batasheemum
      @batasheemum 3 года назад

      Would be grateful

  • @muluadamtemesgen5993
    @muluadamtemesgen5993 2 года назад +2

    That is very interesting, could you make some video on how to test services and repository ?

  • @sarramerabet2611
    @sarramerabet2611 4 года назад

    thank you so much

  • @rawdiarieswithsunil
    @rawdiarieswithsunil 3 года назад +1

    Pretty clear.. can extend the video series for writing integration for Mapper, Converter, like all different models..? That will clear all the stuff..!

  • @natetolbert3671
    @natetolbert3671 3 года назад +5

    I may be wrong about this it's been a while since I've "looked under the hood" in spring, but doesn't the spring framework, as soon as it sees the at test annotation, create its own mock dependency. I'm thinking that I remember it marks the entire environment so that it can run the tests.
    Also one key point about integration tests just because a test _includes_ integration (via stubs,mocks, etc) that doesn't make it an integration test. When you write a unit test that contains mock dependencies on neighboring classes, you're not writing assertions to check that those integrations are working as intended, as you would in an integration test. in fact, with mocks the integration isn't even there. The entire point of frameworks like makito is to take the 'integration' factor out of the dependencies.
    In summary, the point I'm trying to make is that while unit tests may contain dependencies, and occasionally with third-party dependencies, may even contain integration, integration tests actually test said integration and fail if it doesn't behave as expected. Just my two cents. Have a great day.
    Btw, have I commented on this video before? This whole thing is feeling eerily deja Vu to me...

  • @armanhosyan5660
    @armanhosyan5660 2 года назад

    Thanks a lot.

  • @JuanCamiloGutierrezFuentes
    @JuanCamiloGutierrezFuentes 3 года назад +1

    thanku man i love u

    • @DanVega
      @DanVega  3 года назад

      Happy to help

  • @foruvasanth
    @foruvasanth 2 года назад +1

    question on integration tests - Whats the best practice if this endpoint need to fetch data from database, do we spin up in memory like H2 or hit the db by running these tests in Dev??

  • @johnvoorhees2331
    @johnvoorhees2331 Год назад

    I just found our videos 2 weeks ago(Love them) Would it be possible to show how to create proper JUNITs over the Spring Repo Layer. A lot of mocking and i get confused

  • @smaug9833
    @smaug9833 3 года назад

    Hey could you show us how to test REST mappings that must pass through Spring security configuration?

  • @aussieclicks96
    @aussieclicks96 4 года назад +2

    Thank you

    • @DanVega
      @DanVega  4 года назад

      Thank you for watching!

  • @abeplus7352
    @abeplus7352 4 года назад +6

    Thank you ! I had an argument the other day with one of the devs about unit testing in go lang . spinning up an entire http server to just do a controller test is stupid that's an integration test not unit .

    • @natetolbert3671
      @natetolbert3671 3 года назад +1

      As I said above, it doesn't depend on what you're running in a test it depends on what you're testing. You can start up the whole damn application and call every single method in your unit, but if you're assert methods are only testing the functionality inside your unit, in this functionality is not being changed by anything else that is happening, it is still just a unit test. One more time, just for clarity, to be an integration test, it has to __test__ that the units are integrating as expected, and fail if they are not. Otherwise it is just a unit test. Simple as that.
      If we're going to start naming tests based on what they include, then by this logic, every test is a unit test because they all include units...

    • @abhishekpal7291
      @abhishekpal7291 2 года назад

      I have spent a whole night on this thing!

    • @abhishekpal7291
      @abhishekpal7291 2 года назад

      @@natetolbert3671 But my teammates are checking the be rest controller just as an normal classs i.e. calling method and asserting the return value without worrying about checking get/post mapping. Should I go with mockmvc or just normally test like others have done.

  • @MarkGallo-tt8pt
    @MarkGallo-tt8pt 3 года назад

    My assert equals fails because of the URI returns empty with body = null. When I do a get command from the URI it does show me the string I would want to compare but it doesn’t work for the assertEquals

  • @livb4139
    @livb4139 2 года назад

    Is this integration test or unit test? Should you split both on their own folders or something?
    Do you have a video like for testing this but also using a service and a repository to do stuff with a db?

  • @manufactured_reality
    @manufactured_reality 2 года назад

    Do you see any benefit in doing both unit tests and integration tests with mockito?

  • @demidrek-heyward
    @demidrek-heyward 3 года назад +1

    thanks!

  • @n3x4r3
    @n3x4r3 3 года назад

    But how can do an integration test when my micro service use other 2 micro service to get me a response ? I have to mock the response from the others micro services ? or what , I have a huge doubt about it

  • @EdsonLima-hp6ew
    @EdsonLima-hp6ew 10 месяцев назад +1

    nice :)

    • @DanVega
      @DanVega  10 месяцев назад

      Thanks!

  • @mtc539
    @mtc539 2 года назад +3

    Hi Dan, great video. Is it fair to assume that these kinds of integration tests involving the Spring components ie. @WebMvcTest are excessive? I'm sure the Spring devs test their own MVC-related components, so aren't we just testing something they're already testing themselves before making releases of their libraries? If my assumption is correct here, then is the unit test you made at first in this video all that is needed to ensure the code that YOU wrote is working properly?
    I'm still very new to TDD in general and I'm trying to wrap my head around some of these scenarios and would love your input here.
    Thanks! -Matt

    • @handsome_man69
      @handsome_man69 Год назад +1

      no because the WebMvc test is testing the request parameters you are defining in the rest controller method. This logic cannot be covered by a vanilla test.

  • @nguyentoan9012
    @nguyentoan9012 3 года назад +6

    I solved the problem " java.lang.IllegalStateException: Failed to load ApplicationContext" by repacing 2 annotations of the test class with @SpringBootTest
    and @AutoConfigureMockMvc.

    • @Wegman7
      @Wegman7 3 года назад +1

      I'm new to Java and I have no idea why this works/ how it's different, but this worked for me too lol.

    • @rabiebelkaida
      @rabiebelkaida 2 года назад

      Thank you bro it's worked well :)

  • @FilipCodes
    @FilipCodes Год назад

    What is the difference between unit test and component test?

  • @shakib_04
    @shakib_04 2 года назад

    you missed a thing at 10:50 , wheren webmvctest annotation does not create bean for @component , service and reporsitory

  • @kekiir
    @kekiir Год назад

    Cool to make the first step by step part (Request builder request...., MvcResul result...., assertEquals(...) with this is much more understandable the code after mvc.perform....

  • @HazemAls
    @HazemAls 3 года назад +1

    wow thanks

    • @DanVega
      @DanVega  3 года назад

      You're welcome

  • @dadams1989
    @dadams1989 2 года назад +1

    Where did you get your shirt? Love it!

    • @DanVega
      @DanVega  Год назад

      I actually made that myself when I briefly got into the t-shirt side hustle game 🤣

  • @Kubakaiser
    @Kubakaiser Год назад

    If you test the whole Spring application, with the *@SpringBootTest* , without mocking any beans, is it called an integration test, or acceptance test?

  • @emaayan
    @emaayan 3 года назад +2

    as far as i know unit tests are designed to test application logic, so if you unit tests a controller that means you have application logic inside a controller which as far as i know , is a big no no.

  • @diegoramos27
    @diegoramos27 2 года назад +1

    Hi Sir why do we need to add HelloController.class inside the @WebMvcTest? is this annotation not capable of doing component scan aromatically thanks ?

    • @DanVega
      @DanVega  2 года назад

      You don't have to but if you to avoid scanning and be specific it could help performance in a larger app

  • @marcop.7278
    @marcop.7278 2 года назад

    So how do you test when you return JSON and you want to test that e.g. variable message of this JSON contains a String, without asserting it to a String per se?
    I'm asking because I'm doing tests where the content of the String is random and cannot be guessed beforehand, we just know it should not be null.

    • @DanVega
      @DanVega  2 года назад

      Do you have an example or could you post one on Github where I could take a look at this?

  • @ildar5184
    @ildar5184 4 месяца назад

    It feels like the distinction between unit and int tests is fuzzy. Because there're different levels of how many levels of your system you can include in your tests. The easiest scenario, when you test just one component, with its integrations with other components replaced by mocks, is unit testing, that's pretty much clear.
    For integration tests, you can test any level of integration, from the simplest, like just plugging the web framework as in your example, and still mocking stuff like database and calls to other microservices, up to spinning up your entire ecosystem, with all layers included, e.g. locally via docker and test containers. Are these types of testing all integration tests? What I've got is that it's still a matter of debate, some people consider the first type (like in your example) to still be unit testing. And I guess the reason for the debate is that it kinda has features of both.

  • @enesb4797
    @enesb4797 Год назад +2

    Hello, I don't have the get() method in 14:55. When I click "Import static method" it gives me lots of methods to choose.

    • @DanVega
      @DanVega  Год назад +1

      I often am confused on where this is coming from as well. Here is the static import for that
      import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;

    • @enesb4797
      @enesb4797 Год назад

      @@DanVega thank you so much!

  • @mykyta1235
    @mykyta1235 Год назад

    It does not matter what you think of the component or unit , it doesn't matter if you don't count it as valuable.
    Integration tests - tests for the stand alone components interaction between their public interfaces.
    Unit tests - are tests for the smallest testable parts of the application.
    That's it.

  • @xmo3608
    @xmo3608 3 года назад +2

    Isn`t @ExtendWith already included by @WebMvc?

    • @DanVega
      @DanVega  3 года назад +1

      I believe it is now, yes. You can always cmd or ctrl+click the annotation to take a look.

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil Год назад +1

    In what cases in tests does it make sense to use a web server, and not MockMvc?

    • @DanVega
      @DanVega  Год назад

      Thank you for the question. When you want to do a true end to end test and simulate a production like environment I would use a web server.

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil Год назад

      @@DanVega thanks a lot

  • @huhuboss8274
    @huhuboss8274 4 года назад +2

    I always get "java.lang.IllegalStateException: Failed to load ApplicationContext" :/

    • @Next80sProject
      @Next80sProject 4 года назад

      maybe you need to add your base package to the @SpringBootApplication(scanBasePackages = "your.base.package") int the UnitVsIntApplication class.

    • @nguyentoan9012
      @nguyentoan9012 3 года назад +2

      I solved that problem by repacing 2 annotations of the test class with @SpringBootTest
      and @AutoConfigureMockMvc.

  • @JafarAli-ly1ue
    @JafarAli-ly1ue 3 года назад +1

    what about service layer unit testing??

    • @DanVega
      @DanVega  3 года назад

      The service layer could mean different things to different people. What are you trying to test in your service layer?

    • @northdankota
      @northdankota 3 года назад +1

      ​@@DanVega if our service layer talks repository and controller layer, wich testing should we do unit ? integration ? or both?

    • @hurle0409
      @hurle0409 3 года назад

      @@northdankota Yeah this is real life scenario. But can't find useful test case for it. Did you find?

    • @northdankota
      @northdankota 3 года назад

      @@hurle0409 i am not sure actually, which or why to choose these options

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil Год назад +1

    Does this mean that the controller cannot be unit tested?

    • @DanVega
      @DanVega  Год назад

      It can be..my question to you would be if you wrote a unit test for that controller what value would it be giving you?

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil Год назад

      @@DanVega Possible shorter execution time.

  • @AmNotLegend
    @AmNotLegend 3 года назад

    @ExtemdWith(SpringExtension.class) is redundant

  • @apritellolives3920
    @apritellolives3920 2 года назад

    Thats how I feel, I feel integration and e2e testing is more valuable than unit testing especially if you developing an IT website that pretty much just manages and displays data.

  • @johnborys9868
    @johnborys9868 2 года назад

    When does anyone ever instantiate a controller in production code? You're righting a test for a scenario that will never occur. This "unit" test seems redundant and totally without value. You are testing your string concatenation. (Logic). A controller should not have business logic. It should delegate that to the service layer.

  • @handsome_man69
    @handsome_man69 Год назад

    There is no hard line between a Unit Test and an Integration Test. If you wanted a pure unit test then you would have to mock every external dependency, which would mean even mocking "String" objects. SUddenly It gets completely absurd. I have been in projects where they have written tests that are about 20 lines long, and that have tested exactly ONE line of code. The value of tests like this are next to ZERO. In my opinion unit tests are generally useless, unless you need to test complex algorithms or things like utils methods like DateUtils and that kind of thing. As soon as you start mocking too much you get tests which have no value. Integration Tests are much better because they more closely resemble Use Cases. As long as the performance/speed of these tests is good (TIP: use in memory databases!!!!! ), then you should focus on them over unit tests. Writing a test that goes from the RestController to the DB is excellent. It perfectly captures a Use Case. As long as the performance is fine..... do it like that!!!!!

  • @robertpeschke7746
    @robertpeschke7746 Год назад +1

    Sorry, but your background music is so annoying and distracting.

    • @DanVega
      @DanVega  Год назад

      Agreed it can be. I was trying new things 🤷‍♂️

  • @zaycef03
    @zaycef03 3 года назад +1

    That is one useless video.. does not explain what to do with service and DAO dependencies..

    • @DanVega
      @DanVega  3 года назад +11

      Sorry this video didn't meet your expectations but let's discuss your comment. This video wasn't met to cover everything you need to know about writing unit and integration tests. This was simply my thoughts on the two types of test and how the lines are blurred.
      If you're interested in seeing me create a tutorial on what to do with service and DAO dependencies in a certain type of test this would have been a much better comment "Thanks for the tutorial Dan... I am a little confused on what do with my service and DAO dependencies in a unit test, any chance you can break that down for me."