【问题标题】:Is there anything similar to Junit Setup Method in Mockito有没有类似于 Mockito 中的 Junit Setup Method 的东西
【发布时间】:2012-12-20 11:37:31
【问题描述】:

我有以下场景

 interface DAO
 {
      String a();
      String b();
      String c();

 }

我创建了这个 DAO 接口的模拟,并将它提供给一个名为 DAOProcess 的东西。在 DAOProcess 内部,我有各种方法调用 DAO 方法 a、b 和 c。

现在每次我需要在 DAOProcess 中对方法进行单元测试时,我都会写 when(mockDAO.a()).thenReturn("test")

无论如何我可以将这些when(mockDAO.a()).thenReturn("test") 移动到所有测试用例中吗?

【问题讨论】:

    标签: java junit mocking mockito


    【解决方案1】:

    如果您的测试用例都在一个类中,您可以使用带有 @Before 注释的方法,例如:

    ...
    private DAO mockDAO;
    
    @Before 
    public void setUp() {
        mockDAO = mock(DAO.class);
        when(mockDAO.a()).thenReturn("test");
        ...etc...
    }    
    ...
    

    或者,如果您需要多个测试类的行为,您可以编写一个实用程序类来设置 Mock 实例的行为,例如:

    public class MockDAOPrototype {
        public DAO getMockWithDefaultBehaviour() {
            final DAO mockDAO = mock(DAO.class);
            when(mockDAO.a()).thenReturn("test");
            ...etc...
    
            return mockDAO;
        }
    }
    

    然后在您的setUp 方法中调用MockDAOPrototype.getMockWithDefaultBehaviour()

    【讨论】:

      【解决方案2】:

      您可以创建一个 abstract 的 AbstractTestCase 类,并由您需要此模拟的所有测试用例扩展。在那个抽象的测试用例中,您将有以下语句。

       @Ignore // just in case your runner thinks this is a JUnit test.
       public abstract class AbstractTestCase
       {
            @Mock
            private DAO mockDAO;
      
            @Before
            private void setupMocks()
            {
                 when(mockDAO.a()).thenReturn("test")
                 ....
            }
       }
      

      在你的具体测试用例类中,你会

       public class MyConcreteTestCase extends AbstractTestCase
       {
            @InjectMocks
            @Autowired
            private DAOProcess daoProcess;
      
            ....
       }
      

      【讨论】:

      • 我不会在这里使用 Autowired 注释,因为它可能会与 spring 的东西混淆。即使 DAOProcess 是在 Spring 上下文中构建的,我也不确定将协作者的引用替换为 mock 是否是一个明智的想法,而这些梁仍然由 spring 管理!
      猜你喜欢
      • 2016-03-16
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多