Попытка получить Mockito и PowerMock вести себя, но я получаю UnfinishedStubbingException
при попытке запустить этот код:PowerMock UnfinishedStubbingException ошибка конечного класса
@RunWith(PowerMockRunner.class)
@PrepareForTest(FileIOHelper.class)
public class FileIOHelperTest {
@Test
public void testIOExceptionOnWrite() {
PowerMockito.mockStatic(FileIOHelper.class);
PowerMockito.doThrow(new IOException()).when(FileIOHelper.class);
PowerMockito.verifyStatic();
FileIOHelper.write(Mockito.anyString(), Mockito.anyString());
}
@After
public void validate() {
Mockito.validateMockitoUsage();
}
}
и этот класс IO
public final class FileIOHelper {
public static void write(final String file, String message, final boolean appendNewLine) {
if(checkArgs(file, message)) {
final Path path = Paths.get(file);
StandardOpenOption mode = StandardOpenOption.APPEND;
if(Files.notExists(path)) {
mode = StandardOpenOption.CREATE_NEW;
}
if(appendNewLine) {
message += System.getProperty("line.separator");
}
try {
Files.write(path, message.getBytes(), mode);
} catch(IOException e) {
handleException(e, "Problem writing to " + file);
}
}
}
private static boolean checkArgs(final String... args) {
if(args != null && args.length > 0) {
for(final String arg : args) {
if(arg == null || arg.isEmpty()) {
return false;
}
}
}
return true;
}
private static void handleException(final IOException e, final String errorMsg) {
handleException(e, errorMsg, true);
}
private static void handleException(final IOException e, final String errorMsg, final boolean printStace) {
checkArgs(errorMsg);
System.err.println(errorMsg);
System.err.println(e.getMessage());
if(printStace) {
e.printStackTrace();
}
}
}
То, что я хочу сделать, это как-то вызвать IOException
, так что можно проверить handleException
. Почему можно спросить? Я смотрю на моем докладе Jacoco и я вижу это:
Я посмотрел на:
- How to mock a void static method to throw exception with Powermock?
- Powermock/mockito does not throw exception when told to
- PowerMockito mock static method which throws exception
- https://github.com/jayway/powermock/wiki/MockitoUsage#how-to-stub-void-static-method-to-throw-exception
- http://www.johnmullins.co/blog/2015/02/15/beginners-guide-to-using-mockito-and-powermockito-to-unit-test-java/
и я все еще полностью потерян. Я понятия не имею, нужно ли мне запускать IOException
или я могу как-то проверить вывод handleException
без doThrow
. Кто-то, помогите!
Журнал ошибок:
org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at FileIOHelperTest.testIOExceptionOnWrite(FileIOHelperTest.java:8) // doThrow line
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, you naughty developer!
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed
Помимо мнения, я нутро ощущения, что накладные расходы powermock и mokito перевешивают его использование. Причина, по которой я обратился к этому, в первую очередь заключается в том, что я не имел понятия, как умышленно «вызывать» «IOException». Если вы можете указать, как это сделать, я могу принять ответ. Кроме того, я вижу, почему использование 'static', но в контексте этого, я не уверен, что альтернатива. Возможно, синглтон? – djthoms
Я добавил несколько предложений в последнем абзаце ... (и я не вижу хорошего способа вызвать исключение IOException). – GhostCat