我在摆弄Mockito和Spring MVC。我正在尝试为我刚刚编写的代码编写单元测试。
这是我的类别服务类:
@Service
public class CategoryService {
@Autowired
@Qualifier("categoryDaoImpl")
private CategoryDao categoryDao;
public void addCategory(Category category) {
category.setId(getLastCategoryId() + 1);
categoryDao.addCategory(category);
}
public Category getCategoryById(int id) {
return categoryDao.getCategoryById(id);
}
public List<Category> getCategories() {
return categoryDao.getAllCategories();
}
public int getCategoriesCount() {
return categoryDao.getCategoriesCount();
}
public int getLastCategoryId() {
if (categoryDao.getAllCategories().size() == 0) {
return 0;
}
return Collections.max(categoryDao.getAllCategories()).getId();
}
public CategoryDao getCategoryDao() {
return categoryDao;
}
public void setCategoryDao(CategoryDao categoryDao) {
this.categoryDao = categoryDao;
}
我已经测试了几乎100%覆盖率的类别道。
现在我想测试CategoryService,但我不知道如何测试它,我的意思是这样的方法:addCategory,getCategoryById,getAllCategories,getCategoiesCount等。
他们只是在与DAO模式交谈,但如果另一个人改变其逻辑怎么办?如果您告诉我或展示如何为如此简短的方法编写测试,我会很高兴。
就 CategoryService 而言,我只为 getLastCategoryId(( 编写了测试:
@Test
public void shouldGetLastCategoryIdWhenListIsEmpty() {
//given
List<Category> list = new ArrayList<Category>();
Mockito.when(categoryDao.getAllCategories()).thenReturn(list);
//when
int lastCategoryId = categoryService.getLastCategoryId();
//then
assertThat(lastCategoryId, is(0));
}
@Test
public void shouldGetLastCategoryIdWhenListIsNotEmpty() {
//given
List<Category> list = new ArrayList<Category>();
list.add(new Category(1, "a", "a"));
list.add(new Category(3, "a", "a"));
list.add(new Category(6, "a", "a"));
Mockito.when(categoryDao.getAllCategories()).thenReturn(list);
//when
int lastCategoryId = categoryService.getLastCategoryId();
//then
assertThat(lastCategoryId, is(6));
}
非常感谢您的帮助:)
此致敬意汤姆
您需要验证服务方法是否按照其协定运行,即使将来对其进行了修改也是如此。
例如,addCategory(Category c(方法添加类别。这可以通过验证 categoryDao.addCategory(( 方法是否使用设置了所需属性的类别对象来验证。在这种情况下,id 应设置为 lastCategoryId。验证可以简单地通过创建 CategoryDao 类的间谍来完成(比使用 mockito 等第三方库更简单。
getCategoryById((、getCategories(( 和 getCategoriesCount(( 方法的测试用例可以验证返回的值是否是 da 返回的值。
我知道这意味着每个方法只有一个测试用例,但这些测试用例只是确认如果在服务方法实现中添加了更多逻辑,则合同保持不变。
下面是一个addCategory()
测试用例
public class CategoryServiceTest {
private CategoryService service;
private CategoryDaoSpy daoSpy;
@Before
public void setUp() {
service = new CategoryService();
daoSpy = new CategoryDaoSpy();
service.setCategoryDao(daoSpy);
}
@Test
public void shouldSaveCategoryWhenCategoryPassed() {
Category category = new Category();
service.addCategory(category);
assertEquals(daoSpy.getAddCategoryCallCount(), 1);
assertEquals(daoSpy.getCategories().size(), 1);
assertEquals(daoSpy.getCategories().get(0).getId(), 1);
}
}
public class CategoryDaoSpy extends CategoryDao {
private int addCategoryCallCount = 0;
private List<Category> categories = new ArrayList<>();
@Override
public void addCategory(Category category) {
this.addCategoryCallCount++;
categories.add(category);
}
public int getAddCategoryCallCount() {
return addCategoryCallCount;
}
public List<Category> getCategories() {
return categories;
}
@Override
public List<Category> getAllCategories() {
return Collections.emptyList();
}
}