2016-11-09 97 views
0

我正在为Mockito设置项目的jUnit测试。调用System Under Test(DrawingService)中的方法时遇到问题。 Mocks包含一个Drawing和一个IDrawingRepository。在Mockito测试中调用方法时出现NullPointerException

我是TDD,单元测试和一般嘲笑的新手,所以也许我做了一些noob错误?任何帮助将不胜感激。

下面是测试类:

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

} 

回答

4

在督促,你的类将有IDrawingRepository弹簧接线。您的测试(单元测试)并非如此。您需要手动挂接它。您的选项是:

  1. 让它作为构造注入
  2. 暴露二传手的IDrawingRepository

我个人会去与构造函数注入,因为它是由你的类要求才能正常工作。您的班级也可以轻松测试。

+0

感谢您的支持!非常感激。 –

1

而是在测试使用@before@After的,你可以简单地用注释和@InjectMocks所有@Mock你的嘲笑对象的拍摄对象。

随着@InjectMocks你甚至不需要获得者和setter的主题。在你的测试中,你永远不会将repository与主题绑定。

@RunWith(MockitoJUnitRunner.class) 
public class DrawingServiceTest { 

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

谢谢!这非常有帮助,解决了我的问题,并简化了课程。 –

+0

乐意提供帮助。继续并将此答案标记为正确:) – LanceP

相关问题