Ricerca nel sito web

Metodo Mockito Mock Void


La maggior parte delle volte il metodo Mockito when() è abbastanza buono per deridere il comportamento di un oggetto. Ma quando dobbiamo prendere in giro un metodo void, non possiamo usare when().

Metodo Mockito Mock Void

Mockito fornisce i seguenti metodi che possono essere utilizzati per deridere i metodi void.

  1. doAnswer(): possiamo usarlo per eseguire alcune operazioni quando viene chiamato un metodo oggetto simulato che restituisce void.
  2. doThrow(): possiamo usare doThrow() quando vogliamo eseguire lo stub di un metodo void che genera un'eccezione.

Creiamo una classe semplice con un metodo void che prenderemo in giro nelle nostre classi di test.

package com.journaldev;

public class Employee {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		if (name == null)
			throw new IllegalArgumentException("Employee Name can't be null");
		this.name = name;
	}

}

Esempio di metodo mock void Mockito

Il metodo Mockito doAnswer() accetta Answer come argomento. È un'espressione lambda per la sua implementazione.

doAnswer((i) -> {
	System.out.println("Employee setName Argument = " + i.getArgument(0));
	assertTrue("Pankaj".equals(i.getArgument(0)));
	return null;
}).when(emp).setName(anyString());

Si noti che l'istruzione return null è richiesta poiché stiamo prendendo in giro il metodo void.

Metodo Mockito mock void con eccezione

Di seguito il frammento di codice mostra come utilizzare il metodo doThrow() per deridere i metodi void con l'eccezione.

doThrow(IllegalArgumentException.class).when(emp).setName(null);

JUnit Mockito esempio di metodo mock void

Ecco un esempio completo in JUnit in cui sto usando Mockito per simulare il metodo void.

package com.journaldev.mockito.voidmethod;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.Test;

import com.journaldev.Employee;

class JUnitMockitoVoidMethod {

	@Test
	void test_mockito_void() {
		Employee emp = mock(Employee.class);

		doThrow(IllegalArgumentException.class).when(emp).setName(null);

		doAnswer((i) -> {
			System.out.println("Employee setName Argument = " + i.getArgument(0));
			assertTrue("Pankaj".equals(i.getArgument(0)));
			return null;
		}).when(emp).setName(anyString());

		when(emp.getName()).thenReturn("Pankaj");

		assertThrows(IllegalArgumentException.class, () -> emp.setName(null));

		emp.setName("Pankaj");
		assertEquals("Pankaj", emp.getName());
	}

}

Esempio di metodo void TestNG Mockito

Poiché le annotazioni JUnit 5 e TestNG sono così simili, non è necessario apportare modifiche specifiche al codice nella classe precedente per passare da JUnit 5 a TestNG. Basta rimuovere le istruzioni di importazione di JUnit 5 e aggiungere le seguenti importazioni per modificare il framework di test da JUnit a TestNG.

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertThrows;
import static org.testng.Assert.assertTrue;

import org.testng.annotations.Test;

Puoi scaricare il codice completo del progetto dal nostro repository GitHub.

Articoli correlati: