Java 使用Mockito/PowerMockito伪造方法参数

Java 使用Mockito/PowerMockito伪造方法参数,java,unit-testing,apache-poi,mockito,powermockito,Java,Unit Testing,Apache Poi,Mockito,Powermockito,我必须对类ServiceImpl的HandlerRequest方法进行单元测试,该类使用ExcelWriter的writeDetailsForCategory,该类使用受保护的方法writeToCell。我已通过writeToCell方法中的FakeExcelSheet。在此之后,我将对映射的值进行断言。如何在protectedwriteToCell方法中传入fakeExcelSheet参数?我的限制是我只能使用Mockito或PowerMockito。继续从我的开始,您可以将特定的ExcelW

我必须对类
ServiceImpl
HandlerRequest
方法进行单元测试,该类使用ExcelWriter的
writeDetailsForCategory
,该类使用受保护的方法
writeToCell
。我已通过
writeToCell
方法中的
FakeExcelSheet
。在此之后,我将对
映射的值进行断言。如何在
protected
writeToCell
方法中传入fakeExcelSheet参数?我的限制是我只能使用Mockito或PowerMockito。

继续从我的开始,您可以将特定的
ExcelWriter
替换为
StringGridWriter
,它写入给定的
StringGrid
。它不知道也不在乎它是否优秀

protected void writeCell(int rowNum, int colNum, String value, Sheet sheet)
{

    if (value == null)
    {
        return;
    }

    Row row = sheet.getRow(rowNum);

    if (row == null)
    {
        row = sheet.createRow(rowNum);
    }

    Cell cell = row.createCell(colNum);
    cell.setCellValue(value);

}
其中
ApacheSheetStringGrid
与我的另一个答案相同。所以现在,即使是
ServiceImpl
也不知道这是在使用excel。这种依赖关系的注入在实践中是最常见的

看看我是如何快速摆脱复杂的excel界面的,并将其归结为一个抽象,一个功能的子集,这只是我的客户想要的接口(),这使得它既易于测试,又易于用其他实现替换。通过不抽象,您将代码与ApacheExcel实现紧密耦合

public class ServiceImpl
{
     ........
     .
     .
     private ExcelWriter excelWriter;
     private Sheet sheet;
     private void handleRequest()
     {

           while("Till there are more rows")
           {
           excelWriter.writeDetailsForCategory(List<String> listOfItems)
           }
     }
 }
public class ExcelWriter()
{
     protected Sheet sheet;
     public void writeDetailsForCategory(List<String> listOfItems)
     {
           for(String item : listOfItems)
           {
                 writeToCell(rowNum, columnNum, value, sheet);
                 columnNum++;
           }
     }
}
protected void writeCell(int rowNum, int colNum, String value, Sheet sheet)
{

    if (value == null)
    {
        return;
    }

    Row row = sheet.getRow(rowNum);

    if (row == null)
    {
        row = sheet.createRow(rowNum);
    }

    Cell cell = row.createCell(colNum);
    cell.setCellValue(value);

}
public final class StringGridWriter() {
     private final StringGrid grid;

     public StringGridWriter(StringGrid grid) {
        this.grid = grid;
     }

     public void writeDetailsForCategory(List<String> listOfItems) {
           for(String item : listOfItems) {
                 grid.writeToCell(rowNum, columnNum, value);
                 columnNum++;
           }
     }
}
public class ServiceImpl {
     ........
     .
     .
     private final StringGridWriter gridWriter;

     public ServiceImpl(StringGridWriter gridWriter) {
         this.gridWriter = gridWriter;
     }

     private void handleRequest() {    
           while("Till there are more rows"){
             gridWriter.writeDetailsForCategory(List<String> listOfItems)
           }
     }
 }
Sheet theApacheSheet = ...;

StringGrid grid = new ApacheSheetStringGrid(theApacheSheet);

StringGridWriter writer = new StringGridWriter(grid);

ServiceImpl service = new ServiceImpl(writer);