2017-08-24 1 views
1

LogicPowerMockito: Unfinished Anstoßen erkannt (Unfinished Stubbing Exception)

public class Logic { 
String date = (LocalDateTime.now()).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); 
} 

Mock-Code

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ LocalDateTime.class }) 
public class LogicTest { 

@InjectMocks 
Logic target = new Logic(); 

PowerMockito.mockStatic(LocalDateTime.class); 
when(LocalDateTime.now()).thenReturn(LocalDateTime.of(2017, 8, 24, 8, 50, 9)); 

} 

Wenn ich versuche, die JUnit-Testfall für die oben genannte Funktion eine Ausnahme "UnfinishedStubbingException" zu schreiben wird gezeigt.

Ich lese andere Antworten, aber selbst danach kann ich den Grund für den Fehler nicht verstehen.

+0

Können Sie versuchen, den Wert von 'LocalDateTime.of (2017, 8, 24, 8, 50, 9)' in einer Zwischenvariablen zu speichern und diese Variable als 'thenReturn'-Parameter zu übergeben? – Berger

+0

gibt es keine Methode um 'wenn (...' –

+0

@Berger es funktionierte! Danke! –

Antwort

2

Ihr Problem ist, dass Sie die Methode LocalDateTime.of(2017, 8, 24, 8, 50, 9) ausführen, nachdem Sie PowerMockito informiert haben, dass LocalDateTime statische Methoden verspottet werden sollten. Daher versucht PowerMockito während eines Anrufs mit Stummschaltung auf verspotteten Methoden zu arbeiten. Du kannst nicht eine verspottete Methode aufrufen, während du gerade dabei bist, eine andere zu verspotten.

Der richtige Weg, um diese Art von Sache zu tun, ist nicht zu spotten LocalDateTime, sondern zu spotten. Ihre Logic Klasse sollte eine Instanz von Clock haben, die Sie injizieren können, und Sie können dann LocalDateTime.now(theClock) anstelle von LocalDateTime.now() verwenden. Dies macht die Logic Klasse viel testbarer, weil Sie dann Ihren Schein Clock injizieren können.

Sie brauchen eigentlich PowerMockito dafür nicht - gewöhnlicher Mockito wird es gut machen.