我创建了一个java类(A(,它从另一个类(B(调用方法。另一个类 (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。
几件事:
-
发布的代码无法编译。在类
C
中,您有methodMockC()
方法。它返回value
变量,但未定义此变量。同样,methodC()
中使用的result
变量也没有定义。 -
在类
C
中,您有一个名为c
的字段,该字段使用new C()
初始化。这意味着,每当您创建C
实例时,代码都会尝试初始化需要创建第二个C
实例的字段。此实例也具有c
字段,因此它将需要创建第三个C
实例,这反过来又需要创建第四个C
实例,而该实例又...;明白我的意思吗?创建C
对象时,您实际上会遇到无限循环。 -
为了使用测试创建的模拟
B
对象,您必须以某种方式将其注入到a
对象中。这就是setInternalState()
正在做的事情吗?具体来说,它是做类似a.b = b
的事情吗?如果没有,您的a
对象将不会使用您的B
模拟。 -
没有必要嘲笑
C
类。如果您的a
对象正在使用 mockB
对象,那么它不再调用原始B
类的方法,因此无需模拟C
- a 只会调用模拟B
上的方法,并且此方法的行为由您的测试指定(在when(b.??????).thenReturn(????)
行中(。
你不能用 mockito 来模拟私有方法。从C类更改您的私有方法(您写错了(
private methodMockC(String val){
return value;
}
向公众
public String methodMockC(String val){
return value;
}