java - Spring DAO 测试

标签 java spring testing dao

我听说建议为每个 DAO 类创建单独的接口(interface),以使其更容易测试。对“为什么”这个问题的回答是关于通过测试一替换原始 DAO 实现的可能性。但没有关于如何做到这一点的信息。

所以,我对如何做到这一点很感兴趣。

假设我们有简单的 DAO 接口(interface):

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 接口(interface)的第二个“测试”实现:

public class FakePersonDaoImpl implements PersonDao {

    public void add() {
        // doing something different
    }
}

嗯?

我们应该在所有地方使用 @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 封装的任何资源。

关于java - Spring DAO 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32530491/

相关文章:

testing - 你如何解决一个不可重现的、随机的和变化不能立即测试的问题?

testing - Jbehave 作为数据驱动测试框架

java - 正确有效地获取此信息

java - 在android中启动asynctask时出错

java - 拦截来自 BlazeDS 的 Date 对象并调整时区差异

java - 在没有 session 的情况下使用 Spring session 范围

java - 通过 javax 拦截器记录用户的 session ID

java - 我使用 Spring-core 4.3.3,但 ConfigurableEnvironment 仍然出现 ClassNotFound 错误

spring - 如何使用 ThreadPoolTask​​Scheduler 动态调度 Spring Batch 作业

testing - 为什么我应该使用 capybara ,因为可以直接使用 Selenium 本身?