Junit设置局部变量
Posted
技术标签:
【中文标题】Junit设置局部变量【英文标题】:Junit set local variable 【发布时间】:2022-01-07 02:07:44 【问题描述】:我在我的 spring boot 项目中使用了额外的 jar 文件。问题是我要测试的方法之一是使用该 jar 中的方法,该方法返回一个值,但也将一个值设置为发布给它的变量。
String valueThatWillBeReturned;
int returnMessage = method(valueThatWillBeReturned);
我不知道为什么方法是这样写的。我不是那个 jar 的作者,我无法调试它,但它就是这样工作的。它将返回将存储在int returnMessage
中的int,并且还将设置发布到它的valueThatWillBeReturned
。
测试它对我来说是个问题。我将int returnMessage
的值设置为:
when(external.method(valueThatWillBeReturned).thenReturn(1);
但是我应该如何设置String valueThatWillBeReturned
的值?
主要问题是我的代码依赖于应该返回的String valueThatWillBeReturned
。
编辑后
我使上面的例子更简单,但会给你更多的细节。我正在使用外部库 ImageSDK.jar。它根据操作系统使用 .dll 或 .so 文件。
所以根据文档我应该有int[] pnMatchTemplate2Index = new int[1];
发布到下面的方法。
int result = libSDK.UFM_Identify(hMatcherContainer[0],
templateForIdentification,
sizeOfTemplateForIdentification,
templatesFromDBForIdentification,
sizeOfEachTemplateFromDB,
numberOfTemplatesForCompare,
5000,
pnMatchTemplate2Index);
方法返回的是int result
,它存储了返回状态,但该方法还设置了pnMatchTemplate2Index
,其中存储了匹配模板的索引。之后我使用templates.get(pnMatchTemplate2Index[0])
来获取我需要的信息。
所以最后我的方法依赖于那个参数来返回值,我不知道Junit如何设置它来测试我的方法返回。
【问题讨论】:
类似“任何”的东西,或者您在执行测试期间传递的值? 如果您需要在方法内部的逻辑中使用此值,则必须将外部方法的调用与其他逻辑分开。因此,它将允许您模拟调用外部方法的方法。 我发布any() 或anyString() 都没有关系。String valueThatWillBeReturned
在我的代码中声明为 emty 变量,并在发布到 method(valueThatWillBeReturned)
时填充数据。问题是我的代码依赖于该返回值。
由于String
是不可变的,valueThatWillBeReturned
在调用method
后将始终具有与以前相同的值。
好吧,在我的例子中,jar 本身有一个处理程序,它将数据发送到正在执行工作的 dll 文件,并将值返回给已发布到 id 的变量。
【参考方案1】:
我找到了解决问题的方法。我将pnMatchTemplate2Index
变量的位置从方法更改为类变量。
Service.class
private int[] pnMatchTemplate2Index = new int[1];//Receives the index of matched template in the template array;
然后在测试方法中我像 Oliver_t 建议的那样嘲笑它。
ServiceTest.class
int [] mockResults = 0;
ReflectionTestUtils.setField(underTest,"pnMatchTemplate2Index", mockResults);
地点:
underTest
是我们正在测试的类
"pnMatcherTemplate2Index"
是我们要在我们正在测试的类中模拟的私有变量
mockResults
是我们要为私有变量设置的值
这样我设法使用pnMatchTemplate2Index
从我的其他方法中获取我想要的索引。
【讨论】:
以上是关于Junit设置局部变量的主要内容,如果未能解决你的问题,请参考以下文章