我有以下方案
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")
移动到所有测试用例中吗?
如果您的测试用例全部都在一个类中,则可以使用用@Before
注释的方法,例如:
...
private DAO mockDAO;
@Before
public void setUp() {
mockDAO = mock(DAO.class);
when(mockDAO.a()).thenReturn("test");
...etc...
}
...
或,如果您需要在许多测试类上进行行为,则可以编写一个实用程序以在模拟实例上设置行为,例如:
public class MockDAOPrototype {
public DAO getMockWithDefaultBehaviour() {
final DAO mockDAO = mock(DAO.class);
when(mockDAO.a()).thenReturn("test");
...etc...
return mockDAO;
}
}
,然后在您的setUp
方法中调用MockDAOPrototype.getMockWithDefaultBehaviour()
。
您可以创建一个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;
....
}