Java 建议模拟生成随机值的私有方法

Java 建议模拟生成随机值的私有方法,java,hibernate,easymock,Java,Hibernate,Easymock,在DocInfoServiceImpl中,我尝试使用easymock模拟以下方法。但我不清楚如何返回使用随机uuid值(关联和docfamily)创建并从私有方法返回的docInfo对象 public void saveDocInfo(String docId) { **DocInfo docInfo = createDocInfo(docId);** LOG.debug("Attempting to persist the doc

在DocInfoServiceImpl中,我尝试使用easymock模拟以下方法。但我不清楚如何返回使用随机uuid值(关联和docfamily)创建并从私有方法返回的docInfo对象

public void saveDocInfo(String docId)
        {
            **DocInfo docInfo = createDocInfo(docId);**
            LOG.debug("Attempting to persist the doc info object for docId [" + docId + "]");
            docInfoDao.save(docInfo);
            LOG.debug("Persisted the doc info object for docId [" + docId + "]");
        }

        private DocInfo createDocInfo(String docId)
        {
            final DocInfo docInfo = new DocInfo();
            docInfo.setId(docId);
            docInfo.setDocFamilyUuid(UUIDGenerator.getInstance().getUuidAsString());
            docInfo.setCorrelationId(UUIDGenerator.getInstance().getUuidAsString());
            return docInfo;
        }
在我使用的测试中,mockDocInfoDao.save在第三行服务的saveDocInfo中被调用

void testSave()
    {
        def String docId = 'I19292800fe1911e0a849005056932b99'
        mockDocInfoDao.save(expectedDocInfo)
        replay(mockDocInfoDao)

        docInfoServiceImpl.saveDocInfo(docId)

        verify(mockDocInfoDao)
    }

私有方法不需要测试,因为它们可能会更改

使用EasyMock,您将检查saveDocInfo中是否至少有一次save调用。所以您可以实例化DocInfo并将其传递到testSave()中


私有方法不需要测试,因为它们可能会更改

使用EasyMock,您将检查saveDocInfo中是否至少有一次save调用。所以您可以实例化DocInfo并将其传递到testSave()中


我在代码中看到的最大缺陷是使用静态方法。 它确实强化了测试任务(参见本视频)

您能以某种方式更新UUIDGenerator类吗?
也许您可以创建一个适配器类,用一个实例方法调用这个UUIDGenerator?

我在代码中看到的最大缺陷是使用静态方法。 它确实强化了测试任务(参见本视频)

您能以某种方式更新UUIDGenerator类吗?
也许您可以使用调用此UUIDGenerator的实例方法创建适配器类?

是否可以修改saveDocInfo以保存DocInfo对象?另外,这不应该是DocInfo上的一个方法吗?逻辑是首先,如果DocInfo对象存在,客户端将使用dao进行查询,如果不存在,则调用save方法创建一个(可以有任何uuid值)并保存它。您到底想测试什么?您可以修改saveDocInfo以保存DocInfo对象吗?另外,这不应该是DocInfo上的方法吗?逻辑是这样的:首先,如果DocInfo对象存在,客户端将使用dao进行查询;如果不存在,则调用save方法创建一个(可以有任何uuid值)并保存它。您到底想测试什么?那么,如果在类中的6个位置使用私有方法,会怎么样。你想测试它6次吗?当出现问题时,是否希望6个测试中断?或者,您可能希望编写一个测试,以确保您的私有方法保持预期的行为,并且不会破坏类的其他部分。。。代码就是代码。重复使用的代码需要独立测试,而不考虑修改者。通常,代码被移动到一个私有方法,以便可以重用。仅仅因为一个方法被调用了6次,并不意味着它将导致6次失败。单元测试通过类的公共接口测试类的行为。失败是由它调用的公共方法还是私有方法引起的并不重要,但是如果它违反了测试的预期,那么它应该失败。如果这是一个问题,那么它是一个应该重构类的标志。那么如果在类中的6个位置使用私有方法会怎么样呢。你想测试它6次吗?当出现问题时,是否希望6个测试中断?或者,您可能希望编写一个测试,以确保您的私有方法保持预期的行为,并且不会破坏类的其他部分。。。代码就是代码。重复使用的代码需要独立测试,而不考虑修改者。通常,代码被移动到一个私有方法,以便可以重用。仅仅因为一个方法被调用了6次,并不意味着它将导致6次失败。单元测试通过类的公共接口测试类的行为。失败是由它调用的公共方法还是私有方法引起的并不重要,但是如果它违反了测试的预期,那么它应该失败。如果这是一个问题,那么它就是应该重构类的标志。
 void testSave()     {
     def String docId = 'I19292800fe1911e0a849005056932b99'
     mockDocInfoDao.save(new DocInfo())
     replay(mockDocInfoDao)

     docInfoServiceImpl.saveDocInfo(docId)

     verify(mockDocInfoDao)
 }