Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用mockito测试在内部调用私有void方法的方法_Java_Mocking_Mockito - Fatal编程技术网

Java 使用mockito测试在内部调用私有void方法的方法

Java 使用mockito测试在内部调用私有void方法的方法,java,mocking,mockito,Java,Mocking,Mockito,我想测试一个在内部调用void方法的方法 下面是代码 public String process(MKSConnectionParams mksConnectionParam, IProgressMonitor progressMonitor) throws Exception { if (null != progressMonitor) { progressMonitor.beginTask("Starting the creation of report", 100

我想测试一个在内部调用void方法的方法

下面是代码

public String process(MKSConnectionParams mksConnectionParam, IProgressMonitor progressMonitor) throws Exception {

    if (null != progressMonitor) {
        progressMonitor.beginTask("Starting the creation of report", 100);
    }
    if (null == mksConnectionParam) {
        initialize(MksLibFactory.getDefault());
    }
    else {
        initialize(mksConnectionParam, MksLibFactory.getDefault());
    }
           --------------
}

public void initialize(MKSConnectionParams mksConnectionParam, IMksLibrary mksLibDefault) throws Exception {
    paramMKSConnectionParams = mksConnectionParam;
    GlobalConstants.hostName = paramMKSConnectionParams.hostname;
    GlobalConstants.port = String.valueOf(paramMKSConnectionParams.port);
    try {
        localISi = mksLibDefault.getSi(paramMKSConnectionParams);
        localIIm = mksLibDefault.getIm(paramMKSConnectionParams);
    }
    catch (MksLibException | AuthenticationError e) {
        throw e;
    }

    ProjectInfo prjInfo = localISi.getProjectInfo(pathToPj);
    projRevCmd = prjInfo.getConfigPath().getConfigPath() + "#b=" + projectRevision;

}
我正在为process()方法编写mockito测试用例。调用
初始化(mksConnectionParam,MksLibFactory.getDefault())
时,测试失败。这是因为在这个过程中,我们调用的是真正的mks连接,而我传递的是虚拟用户名和密码。 我们无法模拟此初始化方法。有没有办法做到这一点

小伪代码会有很大帮助


之前我将方法初始化为
private
。将其更改为
public
会有什么不同吗?

有几种方法可以测试这种情况,不同的人会提倡不同的方法,主要是基于个人偏好

请注意,测试这一点需要更改您正在测试的类的代码(我相信您忽略了提到它的名称)。有一个例外,那就是如果您使用的是PowerMock。我不会在这里详细介绍,但是您会发现更多关于如何将其合并到mockito代码中的信息

回到常规测试方法,问题在于您使用的是real
IMksLibrary
,而不是mock,这是因为您在
过程
方法中获得了对它的引用。以下是您可能需要考虑的几种方法:

  • 更改
    过程
    方法的签名以接收对
    IMksLibrary
    实例的引用,以便测试代码可以提供它的模拟
  • 不是在
    过程中创建引用
    方法,而是通过使用一些DI框架(例如Spring、Guice、CDI等)或作为构造函数参数,向类注入引用
  • 在类中创建一个名为
    getIMjsLibraryInstance()
    的受保护方法,该方法将返回
    MksLibFactory.getDefault()
    ,并使用它代替显式代码(这是现在大多数Java IDE可以自动完成的
    提取方法
    重构)。在测试代码中,您需要创建一个子类(这就是为什么它是我最不喜欢的方法),它重写这个方法并返回一个模拟,然后测试子类而不是真正的类。请注意,这是您应该子类化的唯一的方法
  • 您可能会觉得不愿意使用第三种方法,因为实际上,您并没有真正测试要测试的类(而是它的子类)。我倾向于认为这有床上的味道。但是,请记住,与其他两个方法不同,这不需要对类的客户机进行任何更改(这是一个支持它的非常有力的论点)

    您还可以使用其他方法,但它们在本质上与前两种方法非常相似,并且它们还需要对代码进行一些更改

    如果您觉得任何“常规”测试方法都不够好(由于代码更改或其他原因),欢迎您查看,这将使您能够拦截返回
    IMksLibrary
    实例的静态方法调用,并返回模拟。不过还是要提醒一下。当使用这些类型的解决方案时,会发生一些严重的耦合,因此通常不推荐使用,除非您确实非常需要