1

I have a service project written in Java11. It is using junit tests to cover full code coverage. I have written scheduler method to updateFiles (invoked by Files.walkFileTree) in FileReceivingStateMarkerService class. I want to test static call Files.walkFileTree from test class written for FileReceivingStateMarkerService. I need to use PowerMockRunner to test static call as it cannot be tested by simple MockitoJunitRunner.

On running test, I am getting NPE in setUp method at line - mockStatic(Files.class);

Can you please help me to resolve issue on how to configure powermock with Java11 and initialize static class?

I configured powermock in service project (in Java11) as below

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.0-RC.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.0-RC.1</version>
    <scope>test</scope>
</dependency>

FileReceivingStateMarkerService class

class FileReceivingStateMarkerService {
    private static final Logger LOG = LoggerFactory.getLogger(FileReceivingStateMarkerService.class);

    private final FileProcessingActivityRepositoryService fileProcessingActivityRepositoryService;
    private final FilePollActivityRepository filePollActivityRepository;
    private final FileProcessingRequestRepositoryService fileProcessingRequestRepositoryService;

    @Autowired
    FileReceivingStateMarkerService(FileProcessingActivityRepositoryService fileProcessingActivityRepositoryService, FilePollActivityRepository filePollActivityRepository,
                                           FileProcessingRequestRepositoryService fileProcessingRequestRepositoryService) {
        this.fileProcessingActivityRepositoryService = fileProcessingActivityRepositoryService;
        this.filePollActivityRepository = filePollActivityRepository;
        this.fileProcessingRequestRepositoryService = fileProcessingRequestRepositoryService;
    }

    @Scheduled(fixedDelayString="#{${fileprocess.filemonitor.interval.minutes}*60*1000}")
    void updateFiles() {
        List<FileProcessingRequest> requests = fileProcessingRequestRepositoryService.getFileProcessingRequests();
        LOG.debug("Running file receiving state");
        requests.forEach(request -> {
            LOG.debug("Looking at location {}", request.getFileLocation());
            final var fileVisitor = new FileReceivingStateMarkerFileVisitor(filePollActivityRepository
                                                                          , fileProcessingActivityRepositoryService
                                                                          , request);
            try {
                Files.walkFileTree(Path.of(request.getFileLocation()), Collections.emptySet(), 1, fileVisitor);
            } catch(Exception e) {
                LOG.debug(e.getMessage());
            }
        });
    }
}

Test class for FileReceivingStateMarkerService

package com.experianhealth.rfp.scheduler;

import com.experianhealth.rfp.core.DocumentType;
import com.experianhealth.rfp.core.FileProcessingRequest;
import com.experianhealth.rfp.dao.FilePollActivityRepository;
import com.experianhealth.rfp.service.FileProcessingActivityRepositoryService;
import com.experianhealth.rfp.service.FileProcessingRequestRepositoryService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static org.mockito.ArgumentMatchers.any;
import static org.powermock.api.mockito.PowerMockito.mockStatic;

@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*"})
@PrepareForTest(FileReceivingStateMarkerService.class)
public class FileReceivingStateMarkerServicePowerTest {

    @Mock
    private FileProcessingActivityRepositoryService fileProcessingActivityRepositoryService;
    @Mock
    private FilePollActivityRepository filePollActivityRepository;
    @Mock
    private FileProcessingRequestRepositoryService fileProcessingRequestRepositoryService;

    @Before
    public void setUp() throws Exception {
        mockStatic(Files.class);
    }

    @Test
    public void updateFiles() throws Exception {
        String rootDir = "C:\\files_processor";
        List<FileProcessingRequest> requests = new ArrayList<>();
        FileProcessingRequest request = new FileProcessingRequest();
        request.setClientId("123");
        request.setTradingPartnerId("123");
        request.setDocumentId(DocumentType.Payer);
        request.setFileLocation(rootDir);
        requests.add(request);
        final var fileVisitor = new FileReceivingStateMarkerFileVisitor(filePollActivityRepository
                , fileProcessingActivityRepositoryService
                , request);
        try {
            PowerMockito.when(Files.walkFileTree(Path.of(request.getFileLocation() ), Collections.emptySet(), 1, fileVisitor))
                    .thenReturn(any());
        } catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
mate00
  • 2,727
  • 5
  • 26
  • 34
yashaswi
  • 13
  • 2
  • 4
  • Have you tried using the release version `2.0.0` instead of `2.0.0-RC.1`? Anyways, I'm not sure if it's supported yet. The latest release notes only refer to Java 9: https://github.com/powermock/powermock/releases/tag/powermock-2.0.0 – bratkartoffel Apr 17 '19 at 09:33
  • Version 2.0.0 giving NPE when mocking static Files class. Is there any other option to use powermock with java11 ? – yashaswi Apr 17 '19 at 09:39
  • I tried to use @PowerMockIgnore (as in https://stackoverflow.com/questions/52966897/powermock-java-11) still I am getting NPE – yashaswi Apr 17 '19 at 12:59

0 Answers0