Tests Unitaires : Différence entre versions
Ligne 13 : | Ligne 13 : | ||
=Mockito= | =Mockito= | ||
Mocks vs Stubs = Behavioral testing vs State testing | Mocks vs Stubs = Behavioral testing vs State testing | ||
+ | |||
+ | Mockito does not allow Stubbid final & Private methods | ||
==Stubbing== | ==Stubbing== | ||
Empty class, only return the expected | Empty class, only return the expected | ||
Ligne 29 : | Ligne 31 : | ||
==Spy== | ==Spy== | ||
A Spy is a Stub than is also collecting informations during the test | A Spy is a Stub than is also collecting informations during the test | ||
+ | |||
+ | Used on legacy system where you don't really have access to the code or dependencies | ||
+ | |||
** How many times this method is called ? | ** How many times this method is called ? | ||
** Is this method is called at least once ? | ** Is this method is called at least once ? | ||
Ligne 60 : | Ligne 65 : | ||
@Test(expected=RuntimeException.class) | @Test(expected=RuntimeException.class) | ||
</source> | </source> | ||
+ | |||
+ | =Annotations= | ||
+ | ===@Mock=== | ||
+ | Mockito automatically creates a Mock of this class | ||
+ | '''needs @RunWith(MockitoJunitRunner.class)''' | ||
+ | ===@InjectMocks=== | ||
+ | <source lang="Java"> | ||
+ | // Every time we use TodoBusinessImpl we want to inject todoServiceMock | ||
+ | @Mock TodoService todoServiceMock; | ||
+ | when(todoServiceMock.retrieveTodos("dummy"))).thenReturn(todos); | ||
+ | // todoServiceMock is injected as a constructor parameter | ||
+ | TodoBusinessImpl todoBusinessImpl = new TodoBusinessImpl(todoServiceMock) | ||
+ | </source> | ||
+ | Instead of previous code, mockito can help | ||
+ | <source lang="Java"> | ||
+ | // Every time we use TodoBusinessImpl we want to inject todoServiceMock | ||
+ | @Mock TodoService todoServiceMock; | ||
+ | @InjectMocks TodoBusinessImpl todoBusinessImpl ; | ||
+ | when(todoServiceMock.retrieveTodos("dummy"))).thenReturn(todos); | ||
+ | // Replaced with Injected | ||
+ | // MocksTodoBusinessImpl todoBusinessImpl = new TodoBusinessImpl(todoServiceMock) | ||
+ | </source> | ||
+ | ===@Captor=== | ||
+ | <source lang="Java"> | ||
+ | //@Captor ArgumentCaptor .. lets see later | ||
+ | </source> | ||
+ | ===@MockBean=== |
Version du 25 septembre 2020 à 17:34
Sommaire
Configuration
In JUnit 5, the @RunWith annotation has been replaced by the more powerful @ExtendWith annotation.
Before & After
@Before @After
The method with this annotation is executed before or after every test method
@BeforeClass @AfterClass
The method with this annotation is executed before or after every test class
Parametrize Test
- On top of the test class @RunWith(Parameterized.class)
- method annotated with @Parameter is passing Arrays.asList()
Mockito
Mocks vs Stubs = Behavioral testing vs State testing
Mockito does not allow Stubbid final & Private methods
Stubbing
Empty class, only return the expected
- cannot be dinamically created from code
MyMockedService myMockedService = new MyMockedService();
stub(myMockedService.methodToTest("param")).return("value");
Test lifecycle with stubs:
- Setup - Prepare object that is being tested and its stubs collaborators.
- Exercise - Test the functionality.
- Verify state - Use asserts to check object's state.
- Teardown - Clean up resources.
Stubbing Variations
- Argument Matchers
Spy
A Spy is a Stub than is also collecting informations during the test
Used on legacy system where you don't really have access to the code or dependencies
- How many times this method is called ?
- Is this method is called at least once ?
Mock
Fullclass with implementation, same comportement as in real code.
- Creating Objects that simulate the behavior of real objects
- can be dynamically created from code - at runtime
- offer more fonctionnalities than stubbing
- How many times this method is called ?
- Is this method is called at least once ?
MyMockedService myMockedService = mock(MyMockService.class);
when(myMockedService.methodToTest("param")).thenReturn("value");
Test lifecycle with mocks
- Setup data - Prepare object that is being tested.
- Setup expectations - Prepare expectations in mock that is being used by primary object.
- Exercise - Test the functionality.
- Verify expectations - Verify that correct methods has been invoked in mock.
- Verify state - Use asserts to check object's state.
- Teardown - Clean up resources.
Argument Matchers
Mockito extends Matchers and theses methods are available
- any()
- anyString()
- anyList()
- ...
Exceptions
//To prevent from failing when an exception is thrown
@Test(expected=RuntimeException.class)
Annotations
@Mock
Mockito automatically creates a Mock of this class needs @RunWith(MockitoJunitRunner.class)
@InjectMocks
// Every time we use TodoBusinessImpl we want to inject todoServiceMock
@Mock TodoService todoServiceMock;
when(todoServiceMock.retrieveTodos("dummy"))).thenReturn(todos);
// todoServiceMock is injected as a constructor parameter
TodoBusinessImpl todoBusinessImpl = new TodoBusinessImpl(todoServiceMock)
Instead of previous code, mockito can help
// Every time we use TodoBusinessImpl we want to inject todoServiceMock
@Mock TodoService todoServiceMock;
@InjectMocks TodoBusinessImpl todoBusinessImpl ;
when(todoServiceMock.retrieveTodos("dummy"))).thenReturn(todos);
// Replaced with Injected
// MocksTodoBusinessImpl todoBusinessImpl = new TodoBusinessImpl(todoServiceMock)
@Captor
//@Captor ArgumentCaptor .. lets see later