我有以下情况
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")
共同移动到所有测试用例中吗?
答案 0 :(得分:10)
如果您的测试用例都在一个类中,您可以使用注释为@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;
}
}
然后在MockDAOPrototype.getMockWithDefaultBehaviour()
方法中调用setUp
。
答案 1 :(得分:4)
您可以创建一个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;
....
}