Junit,java:模拟方法

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

我创建了一个java类(a),它从另一个类(B)调用一个方法。另一个类(B)正在从第三个类(C)调用一个方法。我模仿了B类中的一些方法。我试图模仿C类中的一个方法。然而,它不起作用。测试类别如下所示:

@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
    类。如果
    a
    对象正在使用mock
    B
    对象,则它不再调用原始
    B
    类的方法,因此无需模拟
    C
    -a将只调用模拟
    B
    上的方法,并且此方法的行为由y指定我们的测试(在
    when(b.???)中。然后返回(????
    行)


您不能用mockito模拟private方法。请从类C更改您的private方法(您写错了)

  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;
  }