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

Поділитися
Вставка
  • Опубліковано 25 січ 2025

КОМЕНТАРІ • 114

  • @DanVega
    @DanVega  4 роки тому +12

    What is your definition of a Unit & Integration Test?

    • @Anbu_Sampath
      @Anbu_Sampath 4 роки тому +5

      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 роки тому +11

      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 роки тому +1

      @@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 2 роки тому +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 2 роки тому

      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 роки тому +52

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

    • @DanVega
      @DanVega  3 роки тому +2

      Glad it helped!

  • @shashidhar71
    @shashidhar71 4 роки тому +13

    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.

  • @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.

  • @asunali313
    @asunali313 2 місяці тому

    thank you. I did integration test once for test task. I relocated. now I want to have a better job and at several interview they asked about integration tests. so I want to be better in that section.

  • @catsbite3634
    @catsbite3634 3 роки тому +1

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

  • @haroonafridi1802
    @haroonafridi1802 3 роки тому +1

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

  • @FellTheSky
    @FellTheSky 4 роки тому +2

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

    • @DanVega
      @DanVega  4 роки тому +1

      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 4 роки тому +1

      @@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 4 роки тому +1

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

    • @batasheemum
      @batasheemum 4 роки тому

      Would be grateful

  • @arjungupta4672
    @arjungupta4672 3 роки тому +1

    Quick and fast way to understand difference and learn 👍

  • @enesb4797
    @enesb4797 2 роки тому +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  2 роки тому +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 2 роки тому

      @@DanVega thank you so much!

  • @natetolbert3671
    @natetolbert3671 4 роки тому +6

    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...

  • @johnvoorhees2331
    @johnvoorhees2331 Рік тому +1

    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

  • @raphaelzamora7974
    @raphaelzamora7974 3 роки тому +1

    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

  • @joshuaecht
    @joshuaecht 4 роки тому +1

    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.

  • @abeplus7352
    @abeplus7352 4 роки тому +7

    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 4 роки тому +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 3 роки тому

      I have spent a whole night on this thing!

    • @abhishekpal7291
      @abhishekpal7291 3 роки тому

      @@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.

  • @foruvasanth
    @foruvasanth 3 роки тому +2

    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??

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil 2 роки тому +2

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

    • @DanVega
      @DanVega  2 роки тому +1

      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 2 роки тому

      @@DanVega thanks a lot

  • @saeidkazemi8480
    @saeidkazemi8480 3 роки тому

    Thanks a millioooon for the great explanation and illustration

  • @stephaneislistening6103
    @stephaneislistening6103 7 місяців тому

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

  • @ildar5184
    @ildar5184 9 місяців тому +1

    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.

  • @Synderesis
    @Synderesis Рік тому

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

  • @jacsdev
    @jacsdev 2 роки тому

    thanks for sharing this kind of content!

  • @shakib_04
    @shakib_04 2 роки тому

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

  • @muditshukla
    @muditshukla 2 роки тому

    Great explanation. Thank you Dan

  • @muluadamtemesgen5993
    @muluadamtemesgen5993 3 роки тому +3

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

  • @kaiser92600
    @kaiser92600 2 роки тому

    Thank you for your tuto, very good work

  • @nguyentoan9012
    @nguyentoan9012 4 роки тому +7

    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 4 роки тому +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 3 роки тому

      Thank you bro it's worked well :)

  • @CodeJava
    @CodeJava 19 днів тому

    How to assert JSON in the response?

  • @diegoramos27
    @diegoramos27 2 роки тому +2

    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 роки тому +1

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

  • @mykyta1235
    @mykyta1235 2 роки тому +1

    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.

  • @emaayan
    @emaayan 3 роки тому +3

    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.

  • @somtovitus
    @somtovitus Рік тому

    this is beautiful, thank you

  • @n3x4r3
    @n3x4r3 3 роки тому +1

    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

  • @FilipCodes
    @FilipCodes 2 роки тому +1

    What is the difference between unit test and component test?

  • @kekiir
    @kekiir Рік тому +1

    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....

  • @taprandich
    @taprandich 3 роки тому +2

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

  • @rawdiarieswithsunil
    @rawdiarieswithsunil 4 роки тому +2

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

  • @teotsi21
    @teotsi21 4 роки тому

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

  • @legacylifey182
    @legacylifey182 3 роки тому +1

    Thank you so much!

  • @Utub-qc2cz
    @Utub-qc2cz 2 роки тому +1

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

  • @mtc539
    @mtc539 3 роки тому +5

    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 2 роки тому +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.

  • @maxo.772
    @maxo.772 3 місяці тому

    Whats the added benefit of the integration test that calls /hello ? Arent you testing spring while you should be testing you program?

  • @marcop.7278
    @marcop.7278 2 роки тому +1

    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?

  • @dadams1989
    @dadams1989 2 роки тому +1

    Where did you get your shirt? Love it!

    • @DanVega
      @DanVega  2 роки тому

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

  • @huhuboss8274
    @huhuboss8274 4 роки тому +3

    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 4 роки тому +3

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

  • @manufactured_reality
    @manufactured_reality 3 роки тому +1

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

  • @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.

  • @manuellarrota
    @manuellarrota 3 роки тому

    Gracias mi pana, muy bien explicado un abrazo!

  • @luvcode567
    @luvcode567 3 роки тому +1

    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

  • @livb4139
    @livb4139 3 роки тому

    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?

  • @Kubakaiser
    @Kubakaiser 2 роки тому

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

  • @xmo3608
    @xmo3608 4 роки тому +3

    Isn`t @ExtendWith already included by @WebMvc?

    • @DanVega
      @DanVega  4 роки тому +1

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

  • @MarkGallo-tt8pt
    @MarkGallo-tt8pt 4 роки тому

    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

  • @VISITLosAngeles
    @VISITLosAngeles 3 роки тому

    Thank you so much sir :)

  • @Playing_Jef
    @Playing_Jef 4 роки тому +2

    what about service layer unit testing??

    • @DanVega
      @DanVega  4 роки тому

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

    • @northdankota
      @northdankota 4 роки тому +1

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

    • @hurle0409
      @hurle0409 4 роки тому

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

    • @northdankota
      @northdankota 4 роки тому

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

  • @ABHISHEKMISHRA-ib5vo
    @ABHISHEKMISHRA-ib5vo 3 роки тому

    Grear Dan! 😊

  • @smaug9833
    @smaug9833 3 роки тому

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

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil 2 роки тому +1

    Does this mean that the controller cannot be unit tested?

    • @DanVega
      @DanVega  2 роки тому

      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 2 роки тому

      @@DanVega Possible shorter execution time.

  • @JuanCamiloGutierrezFuentes
    @JuanCamiloGutierrezFuentes 3 роки тому +1

    thanku man i love u

  • @armanhosyan5660
    @armanhosyan5660 3 роки тому

    Thanks a lot.

  • @GoalSpot99
    @GoalSpot99 4 роки тому +2

    Thank you

    • @DanVega
      @DanVega  4 роки тому

      Thank you for watching!

  • @sarramerabet2611
    @sarramerabet2611 4 роки тому

    thank you so much

  • @demidrek-heyward
    @demidrek-heyward 4 роки тому +1

    thanks!

  • @EdsonLima-hp6ew
    @EdsonLima-hp6ew Рік тому +1

    nice :)

  • @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.

  • @AmNotLegend
    @AmNotLegend 3 роки тому

    @ExtemdWith(SpringExtension.class) is redundant

  • @robertpeschke7746
    @robertpeschke7746 2 роки тому +1

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

    • @DanVega
      @DanVega  2 роки тому

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

  • @zaycef03
    @zaycef03 4 роки тому +1

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

    • @DanVega
      @DanVega  4 роки тому +12

      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."

  • @handsome_man69
    @handsome_man69 2 роки тому

    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!!!!!

  • @procrastinator24
    @procrastinator24 2 роки тому +1

    Nice and clean explanation, thank you!

    • @DanVega
      @DanVega  2 роки тому

      Glad it was helpful!

  • @jmw2846
    @jmw2846 Місяць тому

    Thanks a lot!