miałem podobny problem przy użyciu powermock 1.5.1 i klasy plików i podejrzewam, że ma problem statyczny szyderczy niektóre/wszystkie zajęcia jdk1.7 , chociaż nie wiem dlaczego. Sprawdziłem także wersję javassist i w tym czasie była ona najnowsza (3.18.0-GA),
Rozebrałem moją klasę w teście na samą linię plików i nadal nie działało. Postanowiłem więc spróbować sfałszować kolejną klasę statyczną, StringUtils.chop ("string"); (commons-lang3), a następnie mój test powermock zadziałał i udało mi się go zmusić do wygenerowania wyjątku od makiety.
To udowodniło mi, że zrobiłem wszystko dzięki książce i że statyczne kpiny nie działały na klasach Files, ale zrobiły to na StringUtils.
Przy okazji zmieniłem zarówno wywołania @PrepareForTest, jak i PowerMockito.mockStatic(), aby odnieść się do właściwej klasy.
W końcu zrezygnowałem z kpiny z plików. Tylko heads-up na wypadek, gdyby ktoś inny miał ten sam problem.
EDYCJA. Działa to: Od tamtej pory próbowałem tego ponownie, ponieważ potrzebowałem go w innym projekcie. Istnieje nowsza wersja PowerMock out (1.5.3), która używa zaktualizowanego javassista (3.18.1-GA), który naprawia błąd, o którym wspomniałem w mojej odpowiedzi na inny komentarz.
Mogę konsekwentnie kpić z Files
do pracy dodając testowaną klasę do @PrepareForTest
, a także Files
teraz, nawet jeśli testowana klasa nie eksponuje metod statycznych. Nie musiałem tego robić wcześniej dla innych szyderstw. Nie wiem, dlaczego jest to potrzebne lub działa inaczej w przypadku Files
.
Przykład:
public class MyTestClass {
public void justToTestMocking(Path path) throws IOException {
if (!Files.exists(path)) {
throw new IllegalArgumentException("I know there is a deleteIfExists() but I am just testing mocking");
}
Files.delete(path);
}
}
A poniżej testu:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Files.class, MyTestClass.class})
public class MyTestClassTest {
@Before
public void setUp() {
mockStatic(Files.class);
}
@Test
public void justToTestMocking_WillDeletePath() throws IOException {
Path path = mock(Path.class);
MyTestClass test = new MyTestClass();
when(Files.exists(path)).thenReturn(true);
test.justToTestMocking(path);
verifyStatic();
Files.delete(path);
}
}
BTW jestem coraz NoSuchFileException. – Stainedart