独立运行单元测试,不涉及弹簧

时间:2015-11-04 12:35:40

标签: spring unit-testing spring-boot testng mockito

我的应用程序是用spring boot编写的。 我正在使用testNGmockito进行单元测试。

我对单元测试的工作有点困惑。

以下是我的测试类

class StudentServiceTest {
    @mock
    StudentDAO studentDAO;

    @InjectMocks
    StudentService studentService;

    @BeforeMethod
    public void initMock() {
        studentService = new StudentService();
        MockitoAnnotations.initMocks(this);
    }

    @Test(dataprovider.....)
    public void shouldxxxxx(int id......) {
       when(studentDAO.findOne(id)).thenReturn(Student);
       assert......
    }
}

当我跑过上面的测试时。它工作正常。

我有疑虑。

  1. 是否涉及春天。如果不是那么@mock和其他代码如何工作
  2. 我们应该参与spring.If not / yes为什么?
  3. 我使用关键字来初始化服务。好吗。 正如spring unit test documentation他们所说的那样
  4.   

    您可以使用new运算符简单地实例化对象,甚至不涉及Spring。您还可以使用模拟对象而不是真正的依赖项

    如果我没有使用new关键字实例化服务,则显示错误"无法实例化@InjectMocks "。

    如果我autowired服务,那么它需要弹簧容器,我甚至运行单一测试,运行需要太多时间。如果not autowired并使用new关键字,那么它的运行速度非常快。

    1. 上面的代码是否干净?请建议使用testNg和mockito在spring boot中编写单元测试的最佳实践。

1 个答案:

答案 0 :(得分:1)

  1. 是否涉及春天。如果没有那么@mock和其他代码如何工作
      
        

    不,我猜是因为你在嘲笑每一件事。

      
  2. 我们应该参与春天吗?
      
        

    不,除非你想使用spring managed beans。

      
  3. 我使用了新的关键字来初始化服务。

      
        

    即使不需要使用new关键字实例化服务。确保您的initMock()方法使用org.junit.Before注释进行注释,并使用MockitoAnnotations.initMocks(this);初始化

      

    如果你注意了这一点,你就不应该看到无法实例化@InjectMocks 错误

  4. 上面的代码是否干净?
      
        

    当然,如果你注意3个子弹点它将是干净的代码。

      
  5. 你的考试应该是休闲的。

    class StudentServiceTest {
       @mock
       StudentDAO studentDAO;
    
       @InjectMocks
       StudentService studentService;
    
       @org.junit.Before
       public void initMock() { 
          MockitoAnnotations.initMocks(this);
       }
    
       @Test(dataprovider.....)
       public void shouldxxxxx(int id......) {
          when(studentDAO.findOne(id)).thenReturn(Student);
          assert......
       }
    }