Junit,java:嘲弄一个方法

时间:2014-10-09 08:17:16

标签: java junit mockito

我创建了一个从另一个类(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。

2 个答案:

答案 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;
  }
相关问题