Logo

dev-resources.site

for different kinds of informations.

Testando das trincheiras: Como criar mocks e stubs dinâmico com mockito em java

Published at
5/24/2024
Categories
java
mockito
junit
Author
hugaomarques
Categories
3 categories in total
java
open
mockito
open
junit
open
Author
12 person written this
hugaomarques
open
Testando das trincheiras: Como criar mocks e stubs dinâmico com mockito em java

Esse vai ser curtinho. Hoje eu estava tentando testar uma classe que segue o seguinte comportamento:

Book book = bookManager.getBook(id);
book.getId();
Enter fullscreen mode Exit fullscreen mode

Por vários motivos que não vêm ao caso agora, imagine que você não consegue construir o objeto BookManager e também não consegue criar um FakeBook para injetar o ID conforme você deseja.

Pois bem, eu lembrei que era possível criar um mock dinâmico usando Answer do Mockito.

Solução: Um mock dinâmico

A solução fica assim:

@ExtendWith(MockitoExtension.class)
public class MyBookManagerTest {

@Mock 
private BookManager bookManager;
@Mock 
private Book book;

    @Test
    public void testMyMethod() {
        // Define the behavior of the bookManager mock
        when(bookManager.getBook(anyInt())).thenAnswer(new Answer<Book>() {
            @Override
            public Book answer(InvocationOnMock invocation) throws Throwable {
                Object[] args = invocation.getArguments();
                int id = (Integer) args[0];
                when(book.getId()).thenReturn(id);
                return book;
            }
        });
        // Use the mock in the test
        Book book = bookManager.getBook(12345);
        // Verify the behavior of the mock
        assertEquals(12345, book.getId());
    }
}
Enter fullscreen mode Exit fullscreen mode

Note que, ao definirmos o comportamento do BookManager, retornamos uma Answer. Nessa Answer, capturamos o parâmetro passado (veja como usamos a invocation) e o configuramos no mock Book para ser retornado quando fizermos a chamada book.getId().

Dessa forma, em vez de definirmos o mock diversas vezes, podemos definir apenas uma vez e fazer várias chamadas:

// Use the mock in the test
        Book book = bookManager.getBook(12345);
        // Verify the behavior of the mock
        assertEquals(12345, book.getId());

// Esse aqui também funciona porque o nosso mock é configurável
        Book book = bookManager.getBook(6789);
        // Verify the behavior of the mock
        assertEquals(6789, book.getId());
Enter fullscreen mode Exit fullscreen mode

Simplificando: Java 8 + Lambdas 🥰

Se usarmos lambdas em vez da anonymous classe, o nosso exemplo fica ainda mais simples:

        when(bookManager.getBook(anyInt()))
.thenAnswer(invocation -> {
            int id = invocation.getArgument(0);
            when(book.getId()).thenReturn(id);
            return book;
        });
Enter fullscreen mode Exit fullscreen mode

É isso, essa foi direto das trincheiras. Normalmente, eu gosto de evitar mocks se possível e tento usar os objetos reais. No meu caso específico criar o objeto ia ser um trampo do cão e aí eu decidi usar a ferramenta pra simplicar a minha vida.

Keep coding! 💻

junit Article's
30 articles in total
Favicon
verify() method in Mockito example
Favicon
Uses of @spy annotation in junit testing
Favicon
How To Install TestNG in Eclipse: Step By Step Guide
Favicon
How to simulate real BeforeAll and AfterAll in JUnit 5
Favicon
Spring Boot Testing Best Practices
Favicon
Why there are so many assertAll methods in Junit class AssertAll? What is the use of each.
Favicon
Testando das trincheiras: Como criar mocks e stubs dinâmico com mockito em java
Favicon
Mastering Selenium Testing: JUnit Asserts With Examples
Favicon
JUnit Tutorial: An Inclusive Guide [With Enhanced Features]
Favicon
Junit Badge For Git Project
Favicon
Testes Unitários com JUnit no Java
Favicon
JUnit 5 – When to use CSV Providers
Favicon
JUnit Tutorial: An Inclusive Guide [With Enhanced Features]
Favicon
Less Code, More Tests: Exploring Parameterized Tests in JUnit
Favicon
How to find bugs before sending it to production using boundary testing technique
Favicon
Test utilities, or set-up methods considered harmful
Favicon
Dominando o Poder dos Testes Unitários em Java com JUnit: Construa Código Sólido e Confiável! 🚀🧪🔨
Favicon
How to resolve the configuration problem with 2 application.properties in Springboot?
Favicon
TestNG vs JUnit: An Unbiased Comparison Between Both Testing Frameworks
Favicon
Quick introduction to EasyRandom
Favicon
JUnit Tests in Java: A Guide to Writing Effective Unit Tests
Favicon
JUnit's @CsvSource.quoteCharacter
Favicon
Creating a REST API using Spring Boot + Tests + Documentation [part 04]
Favicon
How to use Junit and Mockito for unit testing in Java
Favicon
Unit Testing JSON Functions in Android
Favicon
Adding Unit Testing to OpenSSG
Favicon
Running JMH benchmark from Eclipse
Favicon
Setting up Junit 5 Parallel Test Execution With Maven
Favicon
Integration Tests with Micronaut and Kotlin
Favicon
Spring Boot Integration Testing with MockMvc

Featured ones: