Junit,java:模拟一种方法



我创建了一个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对象正在使用 mock B 对象,那么它不再调用原始 B 类的方法,因此无需模拟C - a 只会调用模拟B上的方法,并且此方法的行为由您的测试指定(在when(b.??????).thenReturn(????)行中(。

你不能用 mockito 来模拟私有方法。从C类更改您的私有方法(您写错了(

  private methodMockC(String val){
      return value;
  }

向公众

  public String methodMockC(String val){
      return value;
  }

相关内容

  • 没有找到相关文章

最新更新