从测试访问私有变量并完成覆盖功能

Posted

技术标签:

【中文标题】从测试访问私有变量并完成覆盖功能【英文标题】:Accessing private variable from test and completing the coverage functionality 【发布时间】:2018-11-23 17:11:29 【问题描述】:

我有一个名为 FilterSite 的类,它有一个 UserDao 类型的实例变量。因为 userDao 变量只在这个类中使用,所以我把它设为私有。

测试时,我通过 setter 方法设置这个私有 userDao。 UserDao 从数据库中获取数据并在 filterData() 中使用。

class FilterSite 
 @Autowired
    private UserDao userDao;

   public void filterData(HttpServletRequest request, HttpServletResponse response) 
   User user = userDao.findByUsername(request.getParameter("username")
     if( user != null && request.getParameter("site").equalsIgnoreCase(user.getSite())) 
         //do something
    
   

 public void setUserDao(UserDao dao) 
        this.userDao = dao;
   
    

我有一个名为 TestFilterSite 的测试类,它创建一个随机 userDao 并设置 FilterSite 类 userDao。

public class TestFilterSite 
    @Mock
    UserDao userDao;

@Before
        public void setup()
            MockitoAnnotations.initMocks(this);
            Mockito.when(userDao.findByUsername(validUsername)).thenReturn(createUser());


               User user = userDao.findByUsername(validUsername);
                Assert.assertEquals(validUsername,user.getUsername());
                Assert.assertEquals(validPassword,user.getPassword());
                Mockito.verify(userDao).findByUsername(validUsername);
            

      @Test
      public void testFilterSiteWhenBlankSiteIsProvided()
        FilterSite filterSite = new FilterSite();
        filterSite.setUserDao(userDao);
        filterSite.filterData(MockHttpServletRequest, MockHttpServletResponse);
        //assert responses

      
        

在阅读了一些文章后,我发现在编写测试类时,我不应该将 getter/setter 用于私有变量。 那么,我该如何为这个类编写测试呢?

【问题讨论】:

看了一些文章,请提供链接 【参考方案1】:

您可以在需要时使用 Getter/Setter。您可以使用 OpenPoJo 库来测试您的 getter/setter 方法的覆盖率。

https://github.com/OpenPojo/openpojo/wiki

【讨论】:

以上是关于从测试访问私有变量并完成覆盖功能的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的类访问私有变量

从不同的类访问私有访问变量数据

7.4 私有变量

GHUnit 访问私有变量

从闭包中访问私有变量

为啥我可以从 main 方法访问私有变量?