簡體   English   中英

在Mockito測試中調用方法時發生NullPointerException

[英]NullPointerException when calling method in Mockito test

我正在使用Mockito為項目設置jUnit測試。 在被測系統(DrawingService)中調用方法時遇到麻煩。 模擬包括一個繪圖和一個IDrawingRepository。

我是TDD,單元測試和模擬領域的新手,所以也許我在犯一些菜鳥錯誤? 任何幫助將不勝感激。

這是測試類:

public class DrawingServiceTest {

    private DrawingService drawingService;
    private Drawing drawing;
    private IDrawingRepository repository;
    private String drawingName;

    @Before // Executed before each @Test
    public void setUp(){
        drawingService = new DrawingService();
        drawing = mock(Drawing.class);
        repository = mock(IDrawingRepository.class);
    }

    @After // Executed after each @Test
    public void tearDown(){
        //clean up code
    }

    @Test
    public void getDrawingTest() throws DrawingNotFoundException{
        drawingName = "A drawing name that exists";

        System.out.println("drawing name is: " + drawingName);
        when(repository.findByName(drawingName)).thenReturn(drawing);

        System.out.println("calling DrawingService.getDrawing(" + drawingName +")");
        drawingService.getDrawing(drawingName); // The test doesn't continue past this line

        System.out.println("verifying repository.findByName(" + drawingName +") is called");
        verify(repository).findByName(drawingName);

    }

這是被測系統:

@Service ("iDrawingService")
public class DrawingService implements IDrawingService {

    @Autowired
    private IDrawingRepository repository;  

    public List<Drawing> getDrawings() {
        return (List<Drawing>) repository.findAll();
    }

    public Drawing getDrawing(String strName) throws DrawingNotFoundException{
        Drawing drawing = repository.findByName(strName); //this line throws the NullPointerException
        if(drawing == null){
            throw new DrawingNotFoundException("No drawing found for name " + strName);
        }
        return drawing;
    }

}

在生產中,您的類將在春季之前連接IDrawingRepository。 您的測試(單元測試)不是這種情況。 您將需要手動將其連接。 您的選擇是:

  1. 使其作為構造函數注入
  2. 公開IDrawingRepository的設置器

我個人會使用構造函數注入,因為您的類需要它才能正常工作。 您的課程也可以輕松測試。

無需在測試中使用@before@After ,您只需使用@InjectMocks注釋主題,並使用@Mock注釋所有@InjectMocks對象。

使用@InjectMocks您甚至不需要主題上的獲取器和設置器。 在測試中,您永遠不要將repository與該主題聯系在一起。

@RunWith(MockitoJUnitRunner.class)
public class DrawingServiceTest {

     @InjectMocks private DrawingService drawingService;
     @Mock private Drawing drawing;
     @Mock private IDrawingRepository repository;
     private String drawingName;

暫無
暫無

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

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