我创建了一个从另一个类(B)调用方法的java类(A)。另一个类(B)从第三类(C)调用方法。我嘲笑了B类的一些方法。我正在尝试从C类中模拟一个方法。但是,它不起作用。测试类如下:
@RunWith(MockitoJUnitRunner.class)
public class TestA {
private A a= new A();
@Mock
private B b;
@Before
public void setUp() throws Exception {
setInternalState(a, "b", b);
}
@Test
public void testMethodA() throws Exception {
when(b.methodMock(anyString())).thenReturn(myValue);
when(c.methodMockC(anyString()).thenReturn(myvalue2);
result=a.methodA("xyz");
Assert.assertEquals("anyValue", result.getValue());
}
}
要测试的类如下。
public class A
{
public B b=new B();
public String methodA (String value) {
String myValue=b.methodMock(value);
String result=b.methodB(myValue,value)
return result;
}
}
public class B
{
public C c=new C();
public String methodB (String myValue,String value) {
String result=c.methodC(myValue);
return result;
}
public String methodMock (String value) {
return result;
}
}
public class C
{
public String methodC (String myValue) {
result=methodMockC(myValue);
return result;
}
public methodMockC(String val){
return value;
}
}
我的方法b.methodMock工作正常,但c.methodMockC无效(二级模拟)。真的很感激回应。提前谢谢。
编辑:我需要在C类中模拟methodMockC,它通过注入对象b被称为methodB-> methodC-> mockMethodC。
答案 0 :(得分:2)
有几件事:
发布的代码无法编译。在课程C
中,您拥有methodMockC()
方法。它返回value
变量,但未定义此变量。同样,result
中使用的methodC()
变量也未定义。
在课程C
中,您有一个名为c
的字段,该字段已使用new C()
初始化。这意味着无论何时您创建C
实例,代码都会尝试初始化需要创建第二个C
实例的字段。此实例还有一个c
字段,因此需要创建第三个C
实例,这反过来将需要创建第四个 C
实例反过来......;看到我的观点?当创建C
对象时,您实际上遇到了无限循环。
为了使用测试创建的模拟B
对象,您必须以某种方式将其注入a
对象。这是setInternalState()
正在做什么?具体来说,它是否像a.b = b
那样做?如果不是,a
对象将不会使用您的B
模拟。
无需模拟C
课程。如果你的a
对象正在使用mock B
对象,那么它不再调用原始B
类的方法,因此不需要模拟C
- 只会调用模拟B
上的方法以及此方法的行为由您的测试指定(在when(b.??????).thenReturn(????)
行中)。
答案 1 :(得分:0)
您无法使用mockito模拟私有方法。从C类改变你的私人方法(你写错了)
private methodMockC(String val){
return value;
}
到公开
public String methodMockC(String val){
return value;
}