写什么测试?

时间:2014-09-15 19:23:03

标签: unit-testing mockito

我知道这是一个基本问题,但由于我的知识不足,我无法开始为我的应用程序编写测试。所以我在这里尝试学习和理解测试内容以及如何根据我的应用场景进行测试。

Class MyController {
  MyService service = new MyService();
  List<String> myList = service.generateSomeList(keyVal);
  model.add("myList", myList);
}

Class MyService {
  ThirdPatryService extService = new ThirdPatryService ();
  MyDao dao = new MyDao();
  public List<String> generateSomeList(Long key) {
    List<String> resultList = dao.fetchMyList(key);
    extService.processData(resultList); //using 3rd party service to process result. It doesn't return anything.
    return formattedList(resultList);
  }
  private List<String> formattedList(List<String> listToProcess) {
    //do some formatting
  }  
}

Class MyDao {
  List<String> fetchMyList(key) {
      //Use DB connection to run sql and return result
  }
}

我想进行单元测试和集成测试。所以我的一些问题是:

  1. 我必须为MyDao进行单元测试吗?我不这么认为,因为我可以通过测试服务级别测试查询结果。
  2. 服务级别的可能测试用例是什么?我可以想一下db和测试格式化功能的测试结果。我错过了任何其他测试吗?
  3. 虽然测试generateSomeList()方法是否可以创建虚拟字符串列表并根据结果进行测试?像下面的代码我自己创建列表并测试自己。这是写这种测试的正确/正确方法吗?

    @Test
    public void generateSomeListTest() {
      //Step 1: Create dummy string list e.g. dummyList =["test1", "test2", "test3"]
      //Step 2: when(mydao.fetchMyList(anyLong()).thenReturn(dummyList);
      //Step 4: result=service.generateSomelist(123L);
      //Step 5: assertEquals(result[i], dummyList[i]);
    }
    
  4. 我不认为我必须测试第三方服务,但我认为我必须确保它被调用。它是否正确?如果是,我怎么能用Mockito做到这一点?
  5. 如何确保第三方服务确实完成了我的数据处理。由于它的返回类型是无效的,我怎么能测试它真的完成它的工作,例如发送电子邮件
  6. 我是否必须为控制器编写测试,或者我可以编写集成测试。
  7. 如果您能回答这些问题以了解应用程序的测试部分,我真的很感激。

    感谢。

1 个答案:

答案 0 :(得分:1)

  1. 他们不是真正的单元测试,但是,你应该测试你的DAO。使用DAO的一个要点恰恰是它们相对容易测试(将一些测试数据存储在数据库中,然后调用执行查询的DAO方法,并检查该方法是否返回它应该返回的内容) ),他们通过模拟DAO使服务层易于测试。在测试服务时,绝对不应该使用真正的DAO。你是模拟DAO。这将使服务测试变得更加简单,速度更快。

  2. 从DB测试结果是DAO测试的工作。服务测试应使用返回硬编码结果的模拟DAO,并检查服务是否与这些硬编码结果应该做什么(格式化,在这种情况下)

  3. 是的,没关系。

  4. 通常,存根依赖关系就足够了。验证它们已被调用通常是多余的。在这种情况下,它可能是一个好主意,因为第三方服务没有返回任何东西。但那是代码味道。为什么它没有返回什么?请参阅Mockito中的方法verify()。这是Mockito文档中的第一点:http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#1

  5. 第三方服务应该是单独测试的,因此是可靠的。因此,您应该假设它完成了文档所说的功能。使用B的A测试不应该测试B.只有A.测试B测试B.

  6. 单元测试通常更易于编写并且执行起来更快。使用单元测试来测试角落情况也更容易。集成测试应该更粗糙。

  7. 请注意:您的代码严重缺乏的是依赖注入。这将使您的代码可测试。因为控制器创建了它的服务来创建它的DAO,所以很难进行测试。相反,应该向控制器注入服务,并且应该使用DAO注入服务。这允许在服务中注入模拟DAO以单独测试服务,并将模拟服务注入控制器以单独测试控制器。