Java PowerMockito whenNew thenReturn不适用于可传递类

Java PowerMockito whenNew thenReturn不适用于可传递类,java,mockito,powermock,Java,Mockito,Powermock,我有以下几种情况 Class A { someMethod() { B b = new B(); b.someMethod(); } } Class B { String someMethod() { C c = new C(); return c.someMethod(); } } Class C { String someMethod() { D d = new D(); return d.getId() } }

我有以下几种情况

Class A {
  someMethod() {
    B b = new B();
    b.someMethod();
  }
}

Class B {
  String someMethod() {
    C c = new C();
    return c.someMethod();
  }
}

Class C {
  String someMethod() {
    D d = new D();
    return d.getId()
  }
}

Class D {
  getId() {
    return "id123";
  }
}
我在UT做什么

@RunWith(PowerMockRunner.class)
@PrepareForTest({A.class, B.class, C.class})
MyTest {
  public void basicTest() {
    D mockDClass = mock(D.class);
    when(mockDClass.getId()).thenReturn("mockedId");
    PowerMockito.whenNew(D.class).withAnyArguments().thenReturn(mockClass);
  }
}
在我的测试中,它应该返回
mockedd
,但控制权转到实际的方法

知道我做错了什么吗? 当我在I类测试中进行新测试时,
whenNew
是否有效?而不是我描述的情况

----------------------更新--------------------- 编写了一个简单的模块来测试上述内容

public class A {
  public String someMethod() {
    B b = new B();
    return b.someMethod();
  }
}

public class B {
  public String someMethod() {
    C c = new C();
    return c.someMethod();
  }
}

public class C {
  public String someMethod() {
    D d = new D();
    return d.getId();
  }
}

public class D {
  public String getId() {
    return "id123";
  }
}
测试:

该测试的输出如下所示:


这个小测试很有效,所以我在实际测试中犯了一些错误。

当您模拟的对象每次被实例化时,新测试都应该有效。实际上,您应该将行'when(D.getId()).thenReturn(“mockedId”)'替换为'when(mockDClass.getId.).thenReturn(“mockedId”)'。 以下代码段应该可以工作:

C测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest({C.class})
public class CTest {

  @Test
  public void someMethodTest() throws Exception {
    D mockDClass = mock(D.class);
    when(mockDClass.getId()).thenReturn("mockedId");
    PowerMockito.whenNew(D.class).withAnyArguments().thenReturn(mockDClass);
    C c = new C();

    String response = c.someMethod();
    verifyNew(D.class).withNoArguments();
    assertEquals("mockedId", response);
  }
}
D测试:

@RunWith(PowerMockRunner.class)
public class DTest {

  @Test
  public void testId() throws Exception {
    D mockDClass = mock(D.class);
    when(mockDClass.getId()).thenReturn("mockedId");
    PowerMockito.whenNew(D.class).withAnyArguments().thenReturn(mockDClass);
    D d = new D();

    verifyNew(D.class).withNoArguments();
    String response = d.getId();
    assertEquals("mockedId", response);
  }
}

哦,很抱歉我实际上有
mockDClass.getid()
,但它不起作用,还更新了问题。你能分享你正在运行的实际测试方法吗?添加了完整的模块吗?我忘了什么时候测试哪个更新起作用了,所以我可能在实际代码中做了一些错误的事情,不过需要帮助
@RunWith(PowerMockRunner.class)
public class DTest {

  @Test
  public void testId() throws Exception {
    D mockDClass = mock(D.class);
    when(mockDClass.getId()).thenReturn("mockedId");
    PowerMockito.whenNew(D.class).withAnyArguments().thenReturn(mockDClass);
    D d = new D();

    verifyNew(D.class).withNoArguments();
    String response = d.getId();
    assertEquals("mockedId", response);
  }
}