Java 使用mockito测试在内部调用私有void方法的方法
我想测试一个在内部调用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
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代码中的信息
回到常规测试方法,问题在于您使用的是realIMksLibrary
,而不是mock,这是因为您在过程
方法中获得了对它的引用。以下是您可能需要考虑的几种方法:
过程
方法的签名以接收对IMksLibrary
实例的引用,以便测试代码可以提供它的模拟过程中创建引用
方法,而是通过使用一些DI框架(例如Spring、Guice、CDI等)或作为构造函数参数,向类注入引用getIMjsLibraryInstance()
的受保护方法,该方法将返回MksLibFactory.getDefault()
,并使用它代替显式代码(这是现在大多数Java IDE可以自动完成的提取方法
重构)。在测试代码中,您需要创建一个子类(这就是为什么它是我最不喜欢的方法),它重写这个方法并返回一个模拟,然后测试子类而不是真正的类。请注意,这是您应该子类化的唯一的方法IMksLibrary
实例的静态方法调用,并返回模拟。不过还是要提醒一下。当使用这些类型的解决方案时,会发生一些严重的耦合,因此通常不推荐使用,除非您确实非常需要