Tests Unitaires : Différence entre versions

De My Limbic Wiki
Aller à : navigation, rechercher
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

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

@MockBean