如何模拟直接使用嘲笑/ powermockito调用的方法?

时间:2018-06-19 12:52:28

标签: java junit mockito powermockito

我正在为方法编写一个JUnit测试用例。

方法

class A extends B {
  public execute() {
    String id = getContext().getid().toString();
  }
}

getContext()方法在类B中定义。

如何模拟getContext()

2 个答案:

答案 0 :(得分:1)

这取决于B如何获取上下文,这里没有显示。

依赖注入

希望您正在使用Depenedncy Injection / IoC,B如下:

abstract class B {
  private final Context context;

  public B(Context context) {
    this.context = context;
  }
}

然后将模拟上下文注入到您的测试中,只需将其传递到构造函数中即可:

public class ATest  {
 @Test
 public void testExecute() {
   // arrange
   Context mockContext = mock(Context.class);
   when(mockContext.getId()).thenReturn(...);
   A a = new A(mockContext);

   // act
   String ret = a.execute()

   // assert
   assertThat(ret).isEqualTo(...);
 }
}

覆盖方法

在这种情况下,您可以做的一件事就是创建A的子类以进行测试。 这比上面的DI方法更混乱,所以您应该更喜欢它。

public class ATest  {
 private final Context mockContext = mock(Context.class);

 @Test
 public void testExecute() {
   // arrange
   when(mockContext.getId()).thenReturn(...);
   A a = new OpenA(mockContext);

   // act
   String ret = a.execute()

   // assert
   assertThat(ret).isEqualTo(...);
 }

  private class OpenA extends A {
    @Override
    protected Context getContext() {
      return mockContext;
    }
  }
}

答案 1 :(得分:0)

您可以spy

public BTest {
    @Spy
    private B underTest;

    @Test
    public void testSomething() {
        doReturn(new MySpeicalContext()).when(underTest).getContext();

        // Testing code...
    }
}