【问题标题】:Unable to mock public methods of another class using powermockito无法使用 powermockito 模拟另一个类的公共方法
【发布时间】:2021-05-25 20:33:05
【问题描述】:

我正在使用 PowerMockito 为一个类编写 junit。我能够模拟私有方法但无法模拟另一个类的公共方法。在下面的测试类中, B 的对象没有被嘲笑。 我在这里做错了什么?

 class A {
  
  B b = new B();
  
  public String handleData() {
    String parameter = getParameter();
    String data = b.getData();
    .....
 }
  
  private String getParameter(){
    .......
    .....
  }
}

另一个具有所有公共方法的 B 类

class B {
  public String getData() {
  .......
  .....
  }
}

现在我有了 A 类的测试类

@PowerMockIgnore("javax.management.*")
@RunWith(PowerMockRunner.class)
@PrepareForTest(fullyQualifiedNames = "org.example.A")
class TestA {
  @Mock
  B b;

  @Before
  public void setUp() {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void handleDataTest()

   A a = spy(new A());
   doReturn("test").when(a, "getParameter");
   >>>>>  when(b.getData().thenReturn("test);
   .........
   .....
   AssertNotNull(a.handleData());
}

以下是我正在使用的依赖项-

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4</artifactId>
  <version>2.0.0-beta.5</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito2</artifactId>
  <version>2.0.0-beta.5</version>
  <scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>2.13.0</version>
  <scope>test</scope>
</dependency>

【问题讨论】:

  • "when(b.getData().thenReturn("test);" - 这不会编译。 --- 我强烈建议尽可能不要使用 powermock,因为 powermock 使用字节码操作。

标签: java mockito powermockito


【解决方案1】:

B b = new B(); 在对象 A 中创建新的 B 实例,每当创建 A 的对象时。只有当 B 以某种方式注入对象 A 时,才能模拟 B 的实例。

【讨论】:

  • "只有当 B 以某种方式注入对象 A 时,才能模拟 B 的实例。" - 如果使用 powermock,则不是这样。我们可以使用 powermock 模拟构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多