簡體   English   中英

方法未獲取模擬結果(Mockito.when()。thenReturn())並且未返回指定的模擬值

[英]Method is not gettting mocked (Mockito.when().thenReturn()) and not returning specified mock value

我正在為受保護的方法編寫測試用例,該方法稱為

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尚未初始化並且為null,方法調用engine.renderAcrossFilms(multiFilmRenderRequest, prop); 給我null,即使我對其進行模擬以返回內容並且該控件進入該方法內部並給出Null Pointer Exception也不應該發生,因為我在模擬它。 此處使用的所有變量都是該方法的局部變量。

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);

    }

我希望我的問題很清楚,希望你能幫助我

在您要測試的方法中,它將創建新實例

MultiFilmRenderRequest multiFilmRenderRequest = new MultiFilmRenderRequest(renderOption, request,new ChoppingPreferences());

並將其用作模擬方法的參數。 但是您可能已經嘲笑了該方法提供的參數不等於printMultipleImages方法傳遞給引擎的參數。

除此之外,我可以看到PrinterProperties prop = Mockito.mock(PrinterProperties.class);

但是此模擬類尚未使用,因此目標測試方法可能還會發送另一個PrinterProperties對象。

您可以使用

engine.renderAcrossFilms(Mockito.any(MultiFilmRenderRequest.class),Mockito.any(PrinterProperties.class))

當您提供更多詳細信息時,我將繼續擴展此答案,但是根據最新更新,您將:

MultiFilmPrintRenderer engine =
    Whitebox.getInternalState(autoPrintEndPoint, "_engine");
// ...
Mockito.when(engine.renderAcrossFilms(multiFilmRenderRequest, prop))
    .thenReturn(renderAcrossFilms);

那么,這個Whitebox.getInternalState是否返回模擬對象?

我在用於調用要嘗試模擬的方法的engine對象上創建了一個模擬,並執行了setInternalState。

MultiFilmPrintRenderer engine = Mockito
                .mock(MultiFilmPrintRenderer.class);
Whitebox.setInternalState(autoPrintEndPoint, "_engine", engine);

這樣就設置了模擬對象。 NPE解決了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM