Junit,java:模拟方法
我创建了一个java类(a),它从另一个类(B)调用一个方法。另一个类(B)正在从第三个类(C)调用一个方法。我模仿了B类中的一些方法。我试图模仿C类中的一个方法。然而,它不起作用。测试类别如下所示:Junit,java:模拟方法,java,junit,mockito,Java,Junit,Mockito,我创建了一个java类(a),它从另一个类(B)调用一个方法。另一个类(B)正在从第三个类(C)调用一个方法。我模仿了B类中的一些方法。我试图模仿C类中的一个方法。然而,它不起作用。测试类别如下所示: @RunWith(MockitoJUnitRunner.class) 公共类遗嘱{ 私有A=新A(); @嘲弄 私人B,; @以前 public void setUp()引发异常{ 设置内部状态(a,“b”,b); } @试验 public void testMethodA()引发异常{ when
@RunWith(MockitoJUnitRunner.class)
公共类遗嘱{
私有A=新A();
@嘲弄
私人B,;
@以前
public void setUp()引发异常{
设置内部状态(a,“b”,b);
}
@试验
public void testMethodA()引发异常{
when(b.methodMock(anyString())。然后返回(myValue);
when(c.methodMockC(anyString())。然后返回(myvalue2);
结果=a.methodA(“xyz”);
Assert.assertEquals(“anyValue”,result.getValue());
}
}
待测试的类别如下所示。
我的方法b.methodMock运行良好,但c.methodMock不运行(二级模拟)。非常感谢您的回复。提前感谢
编辑:我需要模拟C类中的methodMockC,该类通过注入对象b被称为methodB->methodC->mockMethodC。有几件事:
- 发布的代码没有编译。在类
中,您有C
方法。它返回methodMockC()
变量,但未定义此变量。类似地,值
中使用的methodC()
变量也未定义result
- 在类
中,有一个名为C
的字段,该字段用C
。这意味着每当您创建newc()初始化
实例时,代码都会尝试初始化字段,这将导致创建第二个C
实例。此实例还有一个C
字段,因此它将导致创建第三个C
实例,而这又将导致创建第四个C
实例C
实例,然后是…;看到我的观点了吗?当创建C
对象时,实际上会运行到一个无限循环中C
- 为了使用测试创建的模拟
对象,您必须以某种方式将其注入B
对象中。这就是a
正在做的吗?具体地说,是不是做了类似setInternalState()
的事情?如果不是,您的a.B=B
对象将不会使用a
模拟B
- 无需模拟
类。如果C
对象正在使用mocka
对象,则它不再调用原始B
类的方法,因此无需模拟B
-a将只调用模拟C
上的方法,并且此方法的行为由y指定我们的测试(在B
行)when(b.???)中。然后返回(????
private methodMockC(String val){
return value;
}
向公众发布
public String methodMockC(String val){
return value;
}
在TestA中,c.methodMockC(anyString())--->c定义在哪里你告诉我,@Utkarsh Gupta使用when(c.methodMockC(anyString())。然后返回(myvalue2);在TestA类中,你是否将模拟
c
注入b
?请参考我的回复@itayman…谢谢:)@itayman…1)我知道它不能编译..它只是一个示例,在这方面不是一个好的示例,我承认:(2)那是我的一个错误。。C类中的C=新C()…将其删除。3) 是..我正在使用setInternalState()注入模拟对象。4) 通常是的。。如果mock方法中存在该方法,但是…我已经mock了b.methodMock(没有用..只是为了表示),但是我想mock methodMock c,它是通过调用c.methodC从methodB调用的@utkarshgupta当您模拟一个对象时,对象的所有方法都会模拟出来,而不仅仅是您在(..)时调用的方法代码>你可以通过做这个实验看到:改变impl。在C
到的所有方法中,抛出新的RuntimeException()
并运行测试。这对测试没有任何影响,因为被模拟的C
在被模拟的B
一次都不会被使用。@SaiYeYanNaingAye…..是的…对不起..打字错误..编辑过..也请看我对Itayman的回复…这可能有助于更好地理解我的问题…谢谢...)
public String methodMockC(String val){
return value;
}