如何测试这些类型的方法(从服务层)



我在摆弄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();
    }
}

相关内容

  • 没有找到相关文章

最新更新