Java Mockito未完成验证异常

Java Mockito未完成验证异常,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,问题如下。我有几个报告,我想用Mockito模拟和测试。每个报告都给出了相同的未完成验证异常,我迄今为止尝试的任何方法都无法解决该问题。下面是所有家长的其中一份报告的示例 我将any更改为anyString 将ReportSaver从interface更改为abstract类 添加validateMockitoUsage以确定正确的测试 调查了类似的Mockito-有关StackOverflow 测试: public class ReportProcessorTest { priv

问题如下。我有几个报告,我想用
Mockito
模拟和测试。每个报告都给出了相同的
未完成验证异常
,我迄今为止尝试的任何方法都无法解决该问题。下面是所有家长的其中一份报告的示例

  • 我将
    any
    更改为
    anyString
  • ReportSaver
    interface
    更改为
    abstract类
  • 添加
    validateMockitoUsage
    以确定正确的测试
  • 调查了类似的
    Mockito
    -有关
    StackOverflow
测试:

public class ReportProcessorTest {

    private ReportProcessor reportProcessor;

    private ByteArrayOutputStream mockOutputStream = (new ReportProcessorMock()).mock();

    @SuppressWarnings("serial")
    private final static Map<String, Object> epxectedMaps = new HashMap<String, Object>();

    @Before
    public void setUp() throws IOException {
        reportProcessor = mock(ReportProcessor.class);
        ReflectionTestUtils.setField(reportProcessor, "systemOffset", "Europe/Berlin");
        ReflectionTestUtils.setField(reportProcessor, "redisKeyDelimiter", "#");

        Mockito.doNothing().when(reportProcessor).saveReportToDestination(Mockito.any(), Mockito.anyString());
        Mockito.doCallRealMethod().when(reportProcessor).process(Mockito.any());
    }

    @Test
    public void calculateSales() throws IOException {
        Map<String, Object> processedReport = reportProcessor.process(mockOutputStream);
        verify(reportProcessor, times(1)); // The line that cause troubles
        assertThat(Maps.difference(processedReport, epxectedMaps).areEqual(), Matchers.is(true));
    }

    @After
    public void validate() {
        Mockito.validateMockitoUsage();
    }
}
@Component
public class ReportProcessor extends ReportSaver {

    @Value("${system.offset}")
    private String systemOffset;

    @Value("${report.relativePath}")
    private String destinationPathToSave;

    @Value("${redis.delimiter}")
    private String redisKeyDelimiter;

    public Map<String, Object> process(ByteArrayOutputStream outputStream) throws IOException {
        saveReportToDestination(outputStream, destinationPathToSave);
        Map<String, Object> report = new HashMap<>();

        try (InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
             InputStreamReader reader = new InputStreamReader(inputStream)) {

            CSVReaderHeaderAware csvReader = new CSVReaderFormatter(outputStream).headerAware(reader);

            Map<String, String> data;
            while ((data = csvReader.readMap()) != null) {

                String data = data.get("data").toUpperCase();
                Long quantity = NumberUtils.toLong(data.get("quantity"));

                report.put(data, quantity);
            }
        }

        return report;
    }
}
public abstract class ReportSaver {

    public void saveReportToDestination(ByteArrayOutputStream outputStream, String destinationPathToSave) throws IOException {
        File destinationFile = new File(destinationPathToSave);
        destinationFile.getParentFile().mkdirs();
        destinationFile.delete();
        destinationFile.createNewFile();
        OutputStream fileOutput = new FileOutputStream(destinationFile);
        outputStream.writeTo(fileOutput);
    }
}
public class ReportProcessorMock implements GeneralReportProcessorMock {

    private static final String report = ""; // There can be some data in here

    @Override
    public ByteArrayOutputStream mock() {
        byte[] reportBytes = report.getBytes();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(reportBytes.length);
        outputStream.write(reportBytes, 0, reportBytes.length);
        return outputStream;
    }
}
模拟:

public class ReportProcessorTest {

    private ReportProcessor reportProcessor;

    private ByteArrayOutputStream mockOutputStream = (new ReportProcessorMock()).mock();

    @SuppressWarnings("serial")
    private final static Map<String, Object> epxectedMaps = new HashMap<String, Object>();

    @Before
    public void setUp() throws IOException {
        reportProcessor = mock(ReportProcessor.class);
        ReflectionTestUtils.setField(reportProcessor, "systemOffset", "Europe/Berlin");
        ReflectionTestUtils.setField(reportProcessor, "redisKeyDelimiter", "#");

        Mockito.doNothing().when(reportProcessor).saveReportToDestination(Mockito.any(), Mockito.anyString());
        Mockito.doCallRealMethod().when(reportProcessor).process(Mockito.any());
    }

    @Test
    public void calculateSales() throws IOException {
        Map<String, Object> processedReport = reportProcessor.process(mockOutputStream);
        verify(reportProcessor, times(1)); // The line that cause troubles
        assertThat(Maps.difference(processedReport, epxectedMaps).areEqual(), Matchers.is(true));
    }

    @After
    public void validate() {
        Mockito.validateMockitoUsage();
    }
}
@Component
public class ReportProcessor extends ReportSaver {

    @Value("${system.offset}")
    private String systemOffset;

    @Value("${report.relativePath}")
    private String destinationPathToSave;

    @Value("${redis.delimiter}")
    private String redisKeyDelimiter;

    public Map<String, Object> process(ByteArrayOutputStream outputStream) throws IOException {
        saveReportToDestination(outputStream, destinationPathToSave);
        Map<String, Object> report = new HashMap<>();

        try (InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
             InputStreamReader reader = new InputStreamReader(inputStream)) {

            CSVReaderHeaderAware csvReader = new CSVReaderFormatter(outputStream).headerAware(reader);

            Map<String, String> data;
            while ((data = csvReader.readMap()) != null) {

                String data = data.get("data").toUpperCase();
                Long quantity = NumberUtils.toLong(data.get("quantity"));

                report.put(data, quantity);
            }
        }

        return report;
    }
}
public abstract class ReportSaver {

    public void saveReportToDestination(ByteArrayOutputStream outputStream, String destinationPathToSave) throws IOException {
        File destinationFile = new File(destinationPathToSave);
        destinationFile.getParentFile().mkdirs();
        destinationFile.delete();
        destinationFile.createNewFile();
        OutputStream fileOutput = new FileOutputStream(destinationFile);
        outputStream.writeTo(fileOutput);
    }
}
public class ReportProcessorMock implements GeneralReportProcessorMock {

    private static final String report = ""; // There can be some data in here

    @Override
    public ByteArrayOutputStream mock() {
        byte[] reportBytes = report.getBytes();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(reportBytes.length);
        outputStream.write(reportBytes, 0, reportBytes.length);
        return outputStream;
    }
}

验证时,验证模拟的特定公共方法:

verify(reportProcessor, times(1)).process(mockOutputStream);
或在适当的情况下使用通配符:

verify(reportProcessor, times(1)).process(any(ByteArrayOutputStream.class));