有什么类似于Mockito中的Junit设置方法

Vin*_*C M 7 java junit mocking mockito

我有以下场景

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

 }
Run Code Online (Sandbox Code Playgroud)

我创建了一个这个DAO接口的模拟器,并将其提供给称为DAOProcess的东西.在DAOProcess中,我有各种方法调用DAO方法a,b和c.

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

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

Jon*_*han 10

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

...
private DAO mockDAO;

@Before 
public void setUp() {
    mockDAO = mock(DAO.class);
    when(mockDAO.a()).thenReturn("test");
    ...etc...
}    
...
Run Code Online (Sandbox Code Playgroud)

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

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

        return mockDAO;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用MockDAOPrototype.getMockWithDefaultBehaviour()你的setUp方法.


Vik*_*dor 5

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

 @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")
           ....
      }
 }
Run Code Online (Sandbox Code Playgroud)

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

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

      ....
 }
Run Code Online (Sandbox Code Playgroud)