Dagli esempi sul PowerMock homepage, vedo il seguente esempio per parte beffardo un metodo privato con Mockito:È possibile utilizzare il mocking parziale per i metodi statici privati in PowerMock?
@RunWith(PowerMockRunner.class)
// We prepare PartialMockClass for test because it's final or we need to mock private or static methods
@PrepareForTest(PartialMockClass.class)
public class YourTestCase {
@Test
public void privatePartialMockingWithPowerMock() {
PartialMockClass classUnderTest = PowerMockito.spy(new PartialMockClass());
// use PowerMockito to set up your expectation
PowerMockito.doReturn(value).when(classUnderTest, "methodToMock", "parameter1");
// execute your test
classUnderTest.execute();
// Use PowerMockito.verify() to verify result
PowerMockito.verifyPrivate(classUnderTest, times(2)).invoke("methodToMock", "parameter1");
}
Tuttavia, questo approccio non sembra funzionare quando il metodo privato che vogliamo prendere in giro è statico. Vorrei creare un mock parziale della classe inferiore, con il metodo readFile deriso:
package org.rich.powermockexample;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;
import static com.google.common.io.Files.readLines;
public class DataProvider {
public static List<String> getData() {
List<String> data = null;
try {
data = readFile();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
private static List<String> readFile() throws IOException {
File file = new File("/some/path/to/file");
List<String> lines = readLines(file, Charset.forName("utf-8"));
return lines;
}
}
Si prega di qualcuno potrebbe farmi sapere come questo può essere realizzato?
Perché, esattamente? In altre parole, cosa non puoi simulare prendendo in giro solo getData? –
Potrei - ma volevo vedere se è possibile gestire i metodi statici privati in una simulazione parziale con PowerMock. –
Oh. Dovrei cercare la meccanica, ma AFAIK sì, tramite la manipolazione del codice byte, allo stesso modo in cui puoi, ad esempio, prendere in giro o sostituire un costruttore. –