【发布时间】:2017-03-24 05:21:21
【问题描述】:
我正在为一个受保护的方法编写测试用例,该方法被调用
protected boolean printMultipleImages(int rows, int cols, IIOImage[] imgs,
PrintMode mode, AutomaticCroppingOption crop,
double reduction, int renderOption)
在这个方法中,一个数组变量被初始化,下面的代码展示了如何
RenderRequest request = this.formSlotsRenderRequest(rows, cols, imgs,mode, crop, reduction);
// Create a Printer Properties Object...
PrinterProperties prop = this.getAutoPrinterProperties();
// Get the Appropriate Print Rendering Engine..
MultiFilmPrintRenderer engine = this.getPrintRenderer();
MultiFilmRenderRequest multiFilmRenderRequest = new MultiFilmRenderRequest(renderOption, request,new ChoppingPreferences());
assert engine != null;
RenderedImage[] rImageArr =engine.renderAcrossFilms(multiFilmRenderRequest, prop); //NPE here, rImageArr=null, though I mocked the method to return something.
在下面突出显示的行中,变量rImageArr 没有被初始化并且保持为空,
方法调用engine.renderAcrossFilms(multiFilmRenderRequest, prop); 给我null,即使我模拟它返回一些东西,并且控件进入方法内部并给出空指针异常,这不应该发生,因为我正在模拟它。这里使用的所有变量都是方法的局部变量。
RenderedImage[] rImageArr =engine.renderAcrossFilms(multiFilmRenderRequest, prop);
这就是我嘲笑engine.renderAcrossFilms(multiFilmRenderRequest, prop);方法的方式
@Test
public void testPrintMultipleImages() throws Exception
{
//MultiFilmRenderRequest req=Mockito.mock(MultiFilmRenderRequest.class);
MultiFilmPrintRenderer engine=Whitebox.getInternalState(autoPrintEndPoint, "_engine");//new JCPrintRenderEngine();//
System.out.println(engine+"here");
RenderedImage[] renderAcrossFilms=new RenderedImage[]{Mockito.mock(RenderedImage.class)};
PrinterProperties prop=Mockito.mock(PrinterProperties.class);
RenderRequest renderRequest=Mockito.mock(RenderRequest.class);
AutomaticCroppingOption crop=Mockito.mock(AutomaticCroppingOption.class);
PrintMode mode=Mockito.mock(PrintMode.class);
IIOImage img=Mockito.mock(IIOImage.class);
MultiFilmRenderRequest multiFilmRenderRequest = new MultiFilmRenderRequest(1, renderRequest,
new ChoppingPreferences());
PowerMockito.doNothing().when(autoPrintEndPoint,PowerMockito.method(AutoPrintEndPoint.class,"loadImage", IIOImage.class)).withArguments(img);
PowerMockito.doReturn(renderRequest).when(autoPrintEndPoint,PowerMockito.method(AutoPrintEndPoint.class,"formSlotsRenderRequest", int.class, int.class, IIOImage[].class,PrintMode.class,AutomaticCroppingOption.class,double.class)).withArguments(2,2,new IIOImage[]{img},mode,crop,12.5);
PowerMockito.doReturn(prop).when(autoPrintEndPoint,PowerMockito.method(AutoPrintEndPoint.class,"getAutoPrinterProperties")).withNoArguments();
Mockito.when(engine.renderAcrossFilms(Mockito.any(MultiFilmRenderRequest.class),Mockito.any(PrinterProperties.class))).thenReturn(renderAcrossFilms);
Method printMultipleImages=AutoPrintEndPoint.class.getDeclaredMethod("printMultipleImages", int.class,int.class,IIOImage[].class,PrintMode.class,AutomaticCroppingOption.class,double.class,int.class);
printMultipleImages.setAccessible(true);
printMultipleImages.invoke(autoPrintEndPoint,2,2,new IIOImage[]{img},mode,crop,12.5,1);
}
我希望我的问题足够清楚,我希望你能帮助我
【问题讨论】:
-
你是如何定义变量
renderAcrossFilms的? -
另外,您是否尝试过使用 any() 匹配器作为参数?
-
@muzzlator
RenderedImage[] renderAcrossFilms=new RenderedImage[]{Mockito.mock(RenderedImage.class)};我没有使用任何匹配器。 -
我现在很困惑 Akhil,也许是一些调试语句来澄清你所看到的?你在哪里获得NPE?随意在您的帖子中添加更多代码
-
@muzzlator 我在上面发布的第二段代码的最后一行中突出显示了我获得 NPE 的行。
标签: java unit-testing exception junit mockito