【问题标题】:service layer testing in spring mvc using easymock使用easymock在spring mvc中进行服务层测试
【发布时间】:2011-07-18 07:33:54
【问题描述】:

服务接口:

public List<UserAccount> getUserAccounts();
public List<UserAccount> getUserAccounts(ResultsetOptions resultsetOptions, List<SortOption> sortOptions);

服务实现:

public List<UserAccount> getUserAccounts() {
    return getUserAccounts(null, null);
}
public List<UserAccount> getUserAccounts(ResultsetOptions resultsetOptions, List<SortOption> sortOptions) {
    return getUserAccountDAO().getUserAccounts(resultsetOptions, sortOptions);
}

如何使用 easymock 或任何其他可行的测试方法对此进行测试?示例代码将不胜感激。对于简单的模拟传递对象作为参数非常混乱。有人清楚地解释了测试服务层的最佳方法是什么?测试服务接口会被认为是单元测试还是集成测试?

【问题讨论】:

  • 周五晚上问问题不是一个好主意,因为周末没人看这个,周一他们会忙于处理新问题。我相信一些测试专家肯定知道答案和解释,并会帮助我。

标签: unit-testing junit easymock


【解决方案1】:

假设您使用的是带有注释的 JUnit 4:

import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;

public class UserAccountServiceTest 

     private UserAccountServiceImpl service;
     private UserAccountDAO mockDao;

     /**
     * setUp overrides the default, We will use it to instantiate our required
     * objects so that we get a clean copy for each test.
     */
     @Before
     public void setUp() {
          service = new UserAccountServiceImpl();
          mockDao = createStrictMock(UserAccountDAO.class);
          service.setUserAccountDAO(mockDao);
     }

    /**
     * This method will test the "rosy" scenario of passing a valid
     * arguments and retrieveing the useraccounts.  
     */
     @Test
     public void testGetUserAccounts() {

          // fill in the values that you may want to return as results
          List<UserAccount> results = new User(); 

          /* You may decide to pass the real objects for ResultsetOptions & SortOptions */
          expect(mockDao.getUserAccounts(null, null)
               .andReturn(results);

          replay(mockDao);
          assertNotNull(service.getUserAccounts(null, null));
          verify(mockDao);
     }

}

您可能还会发现this article 很有用,尤其是在您使用 JUnit 3 时。

Refer this 获取有关 JUnit 4 的快速帮助。

希望对您有所帮助。

【讨论】:

  • 感谢您的回复,所以每当我们遇到一些与单元测试无关的对象参数时,我们会在 expect 调用中将它们设为 null ?
  • 为这两种方法写单元测试用例真的有意义吗?对我来说,它只是委托给 DAO 层,我们还需要测试吗?
  • 对于一个简单的 getter,它可能不会 - 但是 - 如果您在服务方法中有条件和 if/else 路径,那么它会。另外一件事,单元测​​试的全部目的是对单个单元(在这种情况下为服务)进行单元测试,而不是对服务和 DAO(即所谓的集成测试)进行单元测试。至于传递 null,我选择了最简单的测试。但正如评论中所说,您也应该创建这些对象(ResultSetOptions、SortOptions)。如果它们还没有准备好(即只有接口而没有实现),那么您可能也必须为它们使用模拟实现。
  • @kneethan - 如果你投票也很有帮助 - 这样正确的答案/内容就会向上移动。谢谢。
  • 您也可以选择不模拟 DAO,而是模拟 DAO 下的层,以使测试更加灵活:baeldung.com/2011/10/02/testing-the-service-layer
猜你喜欢
  • 1970-01-01
  • 2020-08-20
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2013-07-06
  • 2022-11-24
相关资源
最近更新 更多