![](/img/trans.png)
[英]NullPointerException when stubbing a test method call with Mockito
[英]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。 您的測試(單元測試)不是這種情況。 您將需要手動將其連接。 您的選擇是:
我個人會使用構造函數注入,因為您的類需要它才能正常工作。 您的課程也可以輕松測試。
無需在測試中使用@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.