PowerMock не будет высмеивать метод stati c для создания исключения в приложении Spring-Boot - PullRequest
0 голосов
/ 23 января 2020

Я понимаю, что есть много очень похожих вопросов. Я прошел через все из них, и все еще не могу заставить мой код работать.

У меня есть служба, определенная в моем приложении Spring-Boot, вот так:

@Service
public class FileStorageService {
    private final Path fileStorageLocation;

    @Autowired
    public FileStorageService(final FileStorageProperties fileStorageProperties) {
            //FileStorageProperties is a very simple class that right now just holds one String value
            this.fileStorageLocation = Paths.get(fileStorageProperties.getUploadDir())
                .toAbsolutePath()
                .normalize();

        try {
            Files.createDirectories(fileStorageLocation);
        } catch (IOException e) {
            // FileStorageException is my custom, runtime exception
            throw new FileStorageException("Failed to create directory for stored files", e);
        }
    }
}

И я Я хочу протестировать сценарий, когда создание каталога не удается, и поэтому мне нужно смоделировать метод Files.createDirectories (). Мой тестовый класс выглядит следующим образом:

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 java.io.IOException;
import java.nio.file.Files;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Files.class})
public class FileStorageServiceTest {
    private static final String UPLOAD_DIR = "uploadDir";

    @Test(expected = FileStorageException.class)
    public void some_test() throws IOException {
        PowerMockito.mockStatic(Files.class);
        PowerMockito.when(Files.createDirectories(Mockito.any())).thenThrow(new IOException());

        new FileStorageService(createFileStorageProperties());
    }

    private FileStorageProperties createFileStorageProperties() {
        final FileStorageProperties fileStorageProperties = new FileStorageProperties();
        fileStorageProperties.setUploadDir(UPLOAD_DIR);
        return fileStorageProperties;
    }
}

Я считаю, что следовал каждому шагу из уроков и вопросов, которые я прочитал. Я использую:

  1. @ RunWith (PowerMockRunner.class),
  2. @ PrepareForTest ({Files.class}),
  3. PowerMockito.mockStati c (файлы .class),
  4. и PowerMockito.when (Files.createDirectories (Mockito.any ())). thenThrow (new IOException ());.

Тем не менее исключение не существует бросили во время теста, и это не удалось. Буду очень благодарен за помощь, потому что я чувствую, что скучаю по чему-то очень простому и просто не вижу этого.

1 Ответ

1 голос
/ 23 января 2020

From: https://github.com/powermock/powermock/wiki/Mock-System

Обычно вы готовите класс, содержащий методы stati c (давайте назовем его X), которые вы хотели бы высмеивать, но потому что это PowerMock не может подготовить системный класс для тестирования, поэтому необходимо использовать другой подход. Поэтому вместо подготовки X вы подготавливаете класс, который вызывает методы stati c в X!

По сути, мы высмеиваем использование класса класса System, а не самого немодируемого класса System.

@PrepareForTest({Files.class})

Альтернативный, не Powermock способ сделать это без насмешки любого системного класса - создать вспомогательный метод, @Spy исходный класс и специально смоделировать этот вспомогательный метод, чтобы вызвать исключение.

when(spy.doSomethingWithSystemClasses()).thenThrow(new Exception("Foo");
...