Ich habe einige Unit-Tests für eine statische Methode geschrieben. Die statische Methode akzeptiert nur ein Argument. Der Typ des Arguments ist eine letzte Klasse. In Bezug auf Code:
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
Also habe Utility
ich für die Klasse eine Testklasse erstellt, UtilityTests
in der ich Tests für diese Methode geschrieben habe getName
. Das Unit-Test-Framework ist TestNG und die verwendete Mocking-Bibliothek ist Mockito
. Ein typischer Test hat also folgende Struktur:
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(...);
}
}
Was ist das Problem ?
Während die Tests lokal erfolgreich ausgeführt werden, schlagen sie in IntelliJ auf Jenkins fehl (wenn ich meinen Code in den Remote-Zweig schiebe, wird ein Build ausgelöst und am Ende werden Komponententests ausgeführt). Die Fehlermeldung lautet wie folgt:
org.mockito.exceptions.base.MockitoException: Klasse / Spion-Klasse kann nicht verspottet werden com.packagename.Customer Mockito kann nicht verspotten / spionieren, weil: - letzte Klasse
Was habe ich versucht?
Ich habe ein bisschen gesucht, um eine Lösung zu finden, aber ich habe es nicht geschafft. Ich stelle hier fest, dass ich die Tatsache, dass es sich um eine Abschlussklasse handelt, nicht ändern darf . Darüber hinaus möchte ich, wenn möglich, das Design überhaupt nicht ändern (z. B. eine Schnittstelle erstellen, die die Methoden enthält, die ich verspotten möchte, und angeben, dass die Customer-Klasse diese Schnittstelle implementiert, wie Jose in seinem Bericht korrekt ausgeführt hat Kommentar). Das, was ich versucht habe, ist die zweite Option, die im Mockito-Finale erwähnt wurde . Trotz der Tatsache, dass dies das Problem behoben hat, bremst es einige andere Unit-Tests :(, die nicht auf offensichtliche Weise behoben werden können.Customer
Fragen
Hier sind die beiden Fragen, die ich habe:
- Wie ist das überhaupt möglich? Sollte der Test nicht sowohl lokal als auch in Jenkins fehlschlagen?
- Wie kann dies aufgrund der oben genannten Einschränkungen behoben werden?
Vielen Dank im Voraus für jede Hilfe.
Customer
es irgendeine Logik oder ist es nur eine dumme Datenklasse? Wenn es sich nur um eine Reihe von Feldern mit Getter und Setter handelt, können Sie es einfach instanziieren.
enable final
Konfiguration in Ihrem Arbeitsbereich funktioniert, aber wenn sie ausgeführt wirdJenkins
, kann sie diese Datei nicht finden. Überprüfen Sie, woJenkins
nach der Datei gesucht wird und ob sie tatsächlich vorhanden ist oder nicht.