Ho scritto alcuni test unitari per un metodo statico. Il metodo statico accetta solo un argomento. Il tipo di argomento è una classe finale. In termini di codice:
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
Così, per la Utility
classe che ho creato una classe di test UtilityTests
in cui ho scritto le prove per questo metodo, getName
. Il framework di unit test è TestNG e la libreria di simulazione utilizzata Mockito
. Quindi un test tipico ha la seguente struttura:
public class UtilityTests {
@Test
public void getNameTest() {
// Arrange
Customer customerMock = Mockito.mock(Customer.class);
Mockito.when(...).thenReturn(...);
// Act
Optional<String> name = Utility.getName(customerMock);
// Assert
Assert.assertTrue(...);
}
}
Qual è il problema ?
Mentre i test vengono eseguiti correttamente localmente, all'interno di IntelliJ, falliscono su Jenkins (quando spingo il mio codice nel ramo remoto, viene avviata una build e i test unitari vengono eseguiti alla fine). Il messaggio di errore è simile al seguente:
org.mockito.exceptions.base.MockitoException: Impossibile deridere / spia classe com.packagename Il cliente Mockito non può deridere / spia perché: - classe finale
Cosa ho provato?
Ho cercato un po ', per trovare una soluzione ma non ce l'ho fatta. Noto qui che non mi è permesso cambiare il fatto che Customer
è una classe finale . Inoltre, vorrei, se possibile, non cambiare affatto il suo design (ad esempio, la creazione di un'interfaccia, che potesse contenere i metodi che desidero deridere e affermare che la classe Customer implementa quell'interfaccia, come giustamente sottolineato da Jose nel suo commento). La cosa che ho provato è la seconda opzione menzionata al mockito-final . Nonostante il fatto che ciò abbia risolto il problema, ha frenato altri test unitari :(, che non possono essere risolti in nessun modo apparente.
Domande
Quindi, ecco le due domande che ho:
- Come è possibile in primo luogo? Il test non dovrebbe fallire sia a livello locale che a Jenkins?
- Come può essere risolto in base ai vincoli che ho menzionato sopra?
Grazie in anticipo per qualsiasi aiuto.
Customer
qualche logica in esso, o è solo una classe di dati stupida? Se è solo un gruppo di campi con getter e setter, puoi semplicemente istanziarlo.
enable final
configurazione funzioni nel tuo spazio di lavoro, ma una volta eseguitaJenkins
non è in grado di trovare questo file. Controlla doveJenkins
sta cercando il file e se è effettivamente lì o no.