Тестирование приложений Springboot с использованием Junits (Методы тестирования для классов, для которых требуются конструкторы с автопроводкой) - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть следующий класс, который мне нужно протестировать с помощью Junits

@Service
public class MyStorageService {
    private final Path fileStorageLocation;

    @Autowired
    public MyStorageService(FileStorageProperties fileStorageProperties) {
        fileStorageLocation = Paths.get(fileStorageProperties.getUploadDir()).toAbsolutePath().normalize();

        try {
            Files.createDirectories(this.fileStorageLocation);
        } catch (Exception ex) {
            logger.error("An Internal error occurred when creating directories: {}", ex);
            throw new FileStorageException("An Internal error occurred when creating directories", ex);
        }
    }
    public String storeFile(String destination, MultipartFile file) {
    //Does some copy and storage operations on file system//
    }
}

У меня есть зависимый компонент FileStorageProperties, как указано ниже, который читает application.properties из папки ресурсов, чтобы получить root путь к каталогу:

@ConfigurationProperties(prefix = "file")
public class FileStorageProperties {
    private String uploadDir;

    public String getUploadDir() {
        return uploadDir;
    }

    public void setUploadDir(String uploadDir) {
        this.uploadDir = uploadDir;

    }
}

У меня есть пример Junit, который я пытаюсь завершить

@RunWith(SpringRunner.class)
@TestPropertySource(locations = "classpath:test.properties")
@SpringBootTest(classes = {MyStorageServiceTests.TestConfiguration.class})
public class MyStorageServiceTests {
    @MockBean
    private FileStorageProperties fileStorageProperties;
    @InjectMocks
    private MyStorageService fileStorageService = new MyStorageService(fileStorageProperties);


    @Test
    public void testFileLocationCreation() {
    //assert file created logic and storeFile method logic//
    }

    @EnableConfigurationProperties(FileStorageProperties.class)
    public static class TestConfiguration {
        // nothing
    }
}

Мне нужно найти правильный способ настройки моего testClass, не хочу лог c для модульного теста. Когда я пытаюсь внедрить fileStorageProperties в конструктор MyStorageService, он становится пустым. Что вызовет java .lang.NullPointerException везде, где используется fileStorageProperties. Я новичок в java (всего 1 месяц опыта). Любое понимание будет полезно. ИСПОЛЬЗОВАНИЕ java 1.8 и SpringJUnit4

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Я смог продолжить, установив поля в моем классе, которые ожидались в моем конструкторе:

    @Autowired
    private FileStorageProperties fileStorageProperties;
    ReflectionTestUtils.setField(fileStorageProperties, "uploadDir",    source.getAbsolutePath());
    MyStorageService myStorageService = new myStorageService(fileStorageProperties);
0 голосов
/ 07 апреля 2020

Mockito @ InjectMocks

Mockito пытается внедрить ложные зависимости, используя один из трех подходов, в указанном порядке.

  1. Внедрение на основе конструктора - когда для класса определен конструктор, Mockito пытается внедрить зависимости, используя самый большой конструктор.
  2. Метод на основе метода сеттера - когда конструкторы не определены, Mockito пытается внедрить зависимости используя методы установки.
  3. Field Based - если конструкторы или внедрение на основе поля невозможно, то mockito пытается внедрить зависимости в само поле.
@InjectMocks
private MyStorageService fileStorageService = new MyStorageService(fileStorageProperties);

Заменить на

@InjectMocks
private MyStorageService fileStorageService;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...