Service层的单元测试:在测试方法单元性和所需Mock的次数上取得平衡
都说单元测试应该喵准单个方法,每个测试方法只测一小部分逻辑。
但另一方面,如果测试时总是要Mock,你就要想办法少Mock一些东西,因为Mock代码写起来是很累、很难看的
Service层的代码往往就是这种情况。看个例子:
你会怎么测下面这样的代码:
//仔细看下,这是一棵4层的判定树public class Service { //为了层次清晰,没有使用驼峰式命名 public boolean do_biz() { if (!is_biz_one_valid()) { return false; } return is_biz_two_valid(); } boolean is_biz_two_valid() { if (!is_two_a_valid()) { return false; } return is_two_b_valid(); } boolean is_two_b_valid() { if (!is_two_b_left_valid()) { return false; } return is_two_b_right_valid(); } ... @Test public void test_do_biz() { Service service = new Service(); // do mocking expect_biz_one_valid(service); expect_biz_two_valid(service); assertTrue(service.do_biz()); } @Test public void test_biz_two() { Service service = new Service(); // do mocking expect_biz_two_a_valid(service); expect_biz_two_b_valid(service); assertTrue(service.is_biz_two_valid()); } @Test public void test_biz_two_b_valid() { Service service = new Service(); // do mocking expect_two_b_left_valid(service); expect_two_b_right_valid(service); assertTrue(service.is_two_b_valid()); } ... //只写了正例 @Test public void test_do_biz() { Service service = new Service(); // do mocking expect_biz_one_valid(service); expect_biz_two_a_valid(service); expect_two_b_left_valid(service); expect_two_b_right_valid(service); assertTrue(service.do_biz()); } //只写了正例