Spring DAO testing
Spring DAO testing
我听说建议为每个 DAO 创建单独的接口 类 以使其更容易测试。问题 "why?" 的答案是关于用测试一替换原始 DAO 实现的可能性。但是没有关于如何做到这一点的信息。
所以,我很想知道如何做到这一点。
假设我们有简单的 DAO 接口:
public interface PersonDao {
void add();
...
}
及其简单的实现:
@Repository
public class PersonDaoImpl implements PersonDao {
public void add() {
// doing something
}
}
我们如何测试它:
public class PersonDaoTest {
@Autowire
FakePersonDao fakePersonDao;
@Test
public void addTest() {
fakePersonDao.add();
}
}
FakeDao
是 PersonDao
接口的第二个 "test" 实现:
public class FakePersonDaoImpl implements PersonDao {
public void add() {
// doing something different
}
}
嗯?
我们应该使用 everywhere @Autowired
与 @Qualifier
结合使用还是有更好的方法?
当人们建议用模拟代替真正的 DAO 时,他们谈论的是测试使用 DAO 的层。所以如果你有一个服务层,测试可能看起来像
public class MyServiceTest {
private MyServiceImpl objectUnderTest = new MyServiceImpl();
private PersonDao fakePersonDao;
@Before
public void setUp() {
fakePersonDao = new FakePersonDao(); // or define it using Mockito
objectUnderTest.setPersonDao(fakePersonDao);
}
}
这样您就可以行使需要测试的服务的功能,而不必依赖于访问 DAO 封装的任何资源。
我听说建议为每个 DAO 创建单独的接口 类 以使其更容易测试。问题 "why?" 的答案是关于用测试一替换原始 DAO 实现的可能性。但是没有关于如何做到这一点的信息。
所以,我很想知道如何做到这一点。
假设我们有简单的 DAO 接口:
public interface PersonDao {
void add();
...
}
及其简单的实现:
@Repository
public class PersonDaoImpl implements PersonDao {
public void add() {
// doing something
}
}
我们如何测试它:
public class PersonDaoTest {
@Autowire
FakePersonDao fakePersonDao;
@Test
public void addTest() {
fakePersonDao.add();
}
}
FakeDao
是 PersonDao
接口的第二个 "test" 实现:
public class FakePersonDaoImpl implements PersonDao {
public void add() {
// doing something different
}
}
嗯?
我们应该使用 everywhere @Autowired
与 @Qualifier
结合使用还是有更好的方法?
当人们建议用模拟代替真正的 DAO 时,他们谈论的是测试使用 DAO 的层。所以如果你有一个服务层,测试可能看起来像
public class MyServiceTest {
private MyServiceImpl objectUnderTest = new MyServiceImpl();
private PersonDao fakePersonDao;
@Before
public void setUp() {
fakePersonDao = new FakePersonDao(); // or define it using Mockito
objectUnderTest.setPersonDao(fakePersonDao);
}
}
这样您就可以行使需要测试的服务的功能,而不必依赖于访问 DAO 封装的任何资源。