Come utilizzare PowerMock / Mockito / EasyMock per utilizzare un oggetto mocked per l'iniezione delle dipendenze?

5

Ho un metodo AuthenticationManager.authenticate(username,password) che viene chiamato in alcuni Metodi di un SomeService sotto test. AuthenticationManager viene iniettato in SomeService:

@Component
public class SomeService {
    @Inject
    private AuthenticationManager authenticationManager;

    public void someMethod() {
        authenticationManager.authenticate(username, password);
        // do more stuff that I want to test
    }
}

Ora per il test unitario ho bisogno del metodo di autenticazione per far finta che funzioni correttamente, nel mio caso non fare nulla, quindi posso verificare se il metodo stesso fa il lavoro previsto (l'autenticazione viene testata altrove in base ai principi di test unitario, tuttavia l'autenticazione deve essere chiamata all'interno di quel metodo)

Quindi sto pensando, ho bisogno di SomeService per usare un% di battuta% co_de che verrà restituito e non fare nient'altro quando AuthenticationManager viene chiamato da authenticate() . Come faccio a farlo con PowerMock (o EasyMock / Mockito, che fanno parte di PowerMock)?

O c'è un altro modo per dire a Spring di usare un po 'di Mock invece del vero affare, quando si fa l'injeeting del someMethod() in AuthenticationManager ?

O il mio disegno è sbagliato?

Grazie!

Modifica: trova una soluzione, vorrebbe sentire commenti

Quindi ho trovato un buon modo per iniettare una simulazione senza dover usare un setter o un livello di pacchetto:

@RunWith(PowerMockRunner.class)
public class TestOrderService {

    @Mock
    private AuthenticationManager authenticationManager;

    @InjectMocks 
    private OrderService orderService = new OrderService();

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        Mockito.doNothing().when(this.authenticationManager).authenticate(null, null);
    }

    @Test
    public void testOrderService() {
        orderService.save(null, null, null);
    }
}

con OrderService come questo:

public void save(String username, Order order) {
    authenticationManager.authenticate(username, password);
    // do something with the order...
}

Ora il metodo di salvataggio chiamerà l'autenticazione sul mock e il mock non mi lascia libero di testare il lavoro effettivo all'interno del mio metodo di servizio (che in realtà sta chiamando un metodo manager ma non era quello il punto;))

    
posta Pete 14.02.2012 - 14:39
fonte

1 risposta

2

Personalmente non utilizzo la molla sul lato di prova dell'unità (tranne forse un singolo test per verificare che il contesto dell'applicazione venga caricato correttamente). Invece uso i metodi setter per collegare manualmente i mock (in realtà utilizzo l'annotazione @Setter di lombok del progetto), OPPURE se sto usando @Autowired , faccio in modo che le variabili membro del pacchetto siano circoscritte in modo che l'unit test possa impostare direttamente i valori. p>

Non vedo come farai funzionare Mockito tramite l'iniezione delle dipendenze, perché continuerai sempre ad aggiornare il tuo oggetto all'interno del test dell'unità e poi a creare comportamenti simulati per i metodi. Inoltre, non perdi molto in questo modo, perché dovrai solo impostare le dipendenze dirette della classe sotto test (perché sono mazze), che è molto più semplice di quello che fa la DI, che è ricorsiva creazione di dipendenze e cablaggio su oggetti reali.

    
risposta data 14.02.2012 - 17:37
fonte

Leggi altre domande sui tag