Я пытаюсь проверить класс утилиты с кучей статических методов. Я пишу тест для метода, который вызывает еще два статических метода. По первому статическому методу мышь, похоже, работает, но он игнорирует второе ожидание и вызывает реальный метод. Есть идеи? Я попытался предоставить второй PowerMock.spy (Utils.class) перед вторым ожиданием, но не повезло. Любая идея, как обойти это?PowerMockito и статические методы
вот пример кода.
package com.personal.test;
import java.io.IOException;
public class Utils {
public static String testUtilOne() {
System.out.println("Static method one");
return "methodone";
}
public static void testUtilsTwo(String s1, String s2, String s3) throws IOException {
throw new IOException("Throw an exception");
}
public static void testUtilsThree() throws TestException {
try {
String s = testUtilOne();
testUtilsTwo("s1", s, "s3");
} catch (IOException ex) {
throw new TestException("there was an exception", ex);
}
}
public static class TestException extends Exception {
public TestException() {
super();
}
public TestException(String message, Exception cause) {
super(message, cause);
}
}
}
package com.personal.test;
import java.io.IOException;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.personal.test.Utils.TestException;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Utils.class})
public class UtilsTest {
@Test
public void testMethodThreeWrapsException() throws Exception {
PowerMockito.spy(Utils.class);
PowerMockito.when(Utils.class, "testUtilOne").thenReturn("This is coming from test");
PowerMockito.spy(Utils.class);
PowerMockito.when(Utils.class, "testUtilsTwo", Mockito.anyString(), Mockito.anyString(), Mockito.anyString()).thenThrow(new IOException("Exception from test"));
try {
Utils.testUtilsThree();
} catch (TestException ex) {
Assert.assertTrue(ex.getCause() instanceof IOException);
Assert.assertEquals("Exception from test", ex.getMessage());
}
}
}
Только для записи: только используйте только рамки * Power * для статического насмешка, если вам нужно. Большую часть времени, когда люди просят Powermock ... это потому, что они создали жесткий/невозможный для проверки код; и они думают, что использование Powermock исправит это. Нет, это не будет. Настоящий ответ - применить хорошие методы OO и не использовать Powermock; -.) – GhostCat