【发布时间】:2020-01-29 11:52:54
【问题描述】:
我的问题不是this 问题。 我想模拟像 Integer 和 String 这样的私有 wrapper 字段。 此外,这些字段位于抽象超类中。
public abstract class SuperSample
{
private Integer var1;
private String var2;
private Service service;
pubic boolean foo()
{
int a = service.doStuff(var1, var2);
return subMethod(a);
}
protected abstract boolean subMethod(int var);
public void setVar1(Integer var1)
{
this.va1 = var1;
}
public Integer getVar1()
{
return var1;
}
public void setVar2(String var2)
{
this.var2 = var2;
}
public String getVar2()
{
return var2;
}
public void setService(Service service)
{
this.service = service;
}
public String getService()
{
return service;
}
}
public class Sample extends SuperSample
{
protected boolean subMethod(int var)
{
return var%2==0?true:false;
}
}
Spring.xml -
<bean id="superSample" class="SuperSample" abstract="true">
<property name="var1" value="2" />
<property name="var2" value="cool" />
</bean>
<bean id="sample" class="Sample" >
<property name="service" ref="service" />
</bean>
在我的 junit 中,我无法模拟或监视 var1 或 var2。在监视/模拟 var1、var2 时出现错误:
org.mockito.exceptions.base.MockitoException:无法模拟/监视类 java.lang.Integer Mockito 无法模拟/监视以下内容: - 最后的课程 - 匿名类 - 原始类型
我想模拟这条线-
service.doStuff(var1, var2)
类似-
@UnitTest
public class SampleTest
{
@Mock
private Service service;
private Integer var1 = 2
private String var2 = "cool";
@InjectMocks
private Sample sample;
@Test
public void test()
{
MockitoAnnotations.initMocks(this);
Mockito.when(service.doStuff(var1, var2)).thenReturn(5);
}
}
【问题讨论】:
-
这似乎是一个 XY 问题。为什么做你需要模拟
Integer?让Integer.valueOf(1).intValue()返回2会给您的测试带来什么好处?为什么不能换一种方式解决? -
你想模拟
service.doStuff(var1, var2);还是什么? -
如果你想模拟
service.doStuff,你需要模拟Service并给你的Sample实例模拟Service而不是实际的Service。 -
@FarrukhChishti 转换为使用构造函数注入,然后将mock传递给构造函数就很简单了。
-
@FarrukhChishti Spring 至少在过去 12 年里一直支持构造函数注入。
标签: java unit-testing junit mockito