Mockito не может макетировать класс с потоком ввода файла - PullRequest
2 голосов
/ 18 октября 2019

Я пытаюсь смоделировать статический метод в классе, используя PowerMock и Mockito, но что-то из-за наличия файла InputStream в этом классе (в, казалось бы, не связанном методе) выдает MockitoException.

Iхотел бы посмеяться над возвращаемым значением CustomProperties.getProperty(), но когда я запускаю тест, я получаю MockitoException о том, что он не может издеваться над классом. Я пытался подавить статический инициализатор и метод loadProperties в моем тесте, и операторы журнала показывают, что они подавляются. Проблема заключается в методе try / catch в методе loadProperties. Как только я закомментирую try / catch с потоком ввода файла, тест проходит. Может кто-нибудь объяснить эту тайну?

Вот класс (отредактированный для краткости):

public class CustomProperties {

    private static Properties properties = null;

    // mock this method's return value
    public static String getProperty(String key) {
        return properties.getProperty(key);
    }

    public static synchronized void loadProperties() {
        properties = new Properties();
        String path = System.getProperty("domain.path");

        try (InputStream fileInputStream = Files.newInputStream(Paths.get(path + "/custom.properties"))) {
            // do stuff
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static {
        loadProperties();
    }
}

Вот мой тест:

@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("com.company.util.CustomProperties")
@PrepareForTest(CustomProperties.class)
public class SanityTest {

    @Before
    public void setUp() throws Exception {
        mockStatic(CustomProperties.class);
        when(CustomProperties.getProperty("someKey")).thenReturn("some value");
        suppress(method(CustomProperties.class, "loadProperties"));
    }

    @Test
    public void sanityTest() {
        assertEquals("some value", CustomProperties.getProperty("someKey"));
    }
}

Вот трассировка стека исключений (отредактировано)для краткости):

org.mockito.exceptions.base.MockitoException: 
Mockito cannot mock this class: class com.company.util.CustomProperties.

Mockito can only mock non-private & non-final classes.
If you're not sure why you're getting this error, please report to the mailing list.

Java               : 1.7
JVM version        : 1.7.0_10-b18

Underlying exception : java.lang.IllegalArgumentException: Could not create type
    ...
Caused by: java.lang.IllegalArgumentException: Could not create type
    ...
Caused by: java.lang.VerifyError: Inconsistent stackmap frames at branch target 2947 in method com.company.util.CustomProperties.loadProperties()V at offset 2936
    ...

И, наконец, версия соответствующих зависимостей:

org.mockito:mockito-core:2.28.2
org.powermock:powermock-module-junit4:2.0.2
org.powermock:powermock-api-mockito2:2.0.2
net.bytebuddy:byte-buddy:1.10.1
...