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();
   }
}

FakeDaoPersonDao 接口的第二个 "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 封装的任何资源。