首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:单元测试设计

Java:单元测试设计
EN

Stack Overflow用户
提问于 2019-07-25 09:05:31
回答 3查看 103关注 0票数 0

我已经实现了一个方法getUsers(),它基本上构建了一个List<ShoppingCart>,然后创建了一个List<User>

代码语言:javascript
复制
public List<User> getUsers() {
   // construct a liste of List<ShoppingCart>
   ....
   // update 
   ...
}

List<ShoppingCart>的构造包含很多逻辑,所以我决定将这些代码移出并创建一个私有方法:

代码语言:javascript
复制
public List<User> getUsers() {
   // construct a liste of List<ShoppingCart>
   List<ShoppingCart> shoppingList = getShoppingList();
   // update 
   ...
}

private List<ShoppingCart> getShoppingList() {
  ...
}

现在我需要对getUsers()进行单元测试。但是我意识到我很难获得List<ShoppingCart>,因为它是一个私有的方法。我不想让getShoppingList()公之于众,因为我在任何地方都不需要它。

我认为在我的代码中存在一个设计问题,单元测试这种包含私有方法返回值的方法的最佳方法是什么?

谢谢。

更新

不,这与Java test class with many private methods不是同一个问题,我的问题不是是否有必要测试私有方法,而是什么应该是更好的设计

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-25 09:22:10

我认为好的选择是用户和购物卡分开的逻辑。如果您同意我的意见,您可以将购物卡逻辑移到不同的类,然后您可以在测试中模拟这个逻辑,然后为getUsers()编写这样的测试:

代码语言:javascript
复制
public class UserTest {

 @Mock
 private ShoppingCard shoppingCard;
 private User sut = new User();

 @Before
 public void setUp(){
    MockitoAnnotations.initMocks(this);
 }


 @Test
 public void shouldReturnUsersEmptyListWhenCardsEmpty(){
    //given
    when(shoppingCard.getShoppingCards()).thenReturn(Collections.emptyList());

    //when
    final List<User> result = sut.getUsers();

    //then
    assertEquals(0, result.size());
 }
}
票数 3
EN

Stack Overflow用户

发布于 2019-07-25 09:10:28

最后,这是关于“纯洁”和“真实世界”的平衡?!

意思:如果您坚持使用私有方法,那么这将阻止您进行部分模拟(例如)。它阻止了你直接测试这个方法。

就我个人而言,在这种情况下,我有时会采取务实的态度:简单地让其他方法包受到保护(而不是私有的)。然后您可以从单元测试中访问它,并且在必要时,使用Mockito间谍来部分模拟这些方法。

“真实世界”设计解决方案:考虑一下“获取购物清单”是否值得在自己的上完全支持。其实,这么“复杂”的活动听起来很奇怪.作为一种私人的方法。这样做的结果可能是:您开始复制代码。如果有one中央服务(类)为您提供“购物列表”,那么任何需要该列表的代码.能从那里得到它。

票数 2
EN

Stack Overflow用户

发布于 2019-07-25 09:11:49

如果方法应该是私有的,则不应该对其进行单元测试。这给您留下了两个选项:

  • getShoppingList()公之于众
  • 不要单元测试getShoppingList()

如果getShoppingList()的正确性是整个应用程序工作所必需的,那么您应该公开它并为它创建单元测试。

但是,如果只有代码调用它,然后处理它,并且这些方法是面向用户的,那么您可以简单地测试这些方法,并确保它们按照预期运行。这就被动地保证了getShoppingList()按预期工作。

假设您有一个错误,使getShoppingList()抛出某种异常。然后,在对getUsers()的测试中,您应该会看到这个异常被抛出(假设它调用了getShoppingList() )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57198191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档