模拟最终的 class 变量

Mocking a final class variable

我正在尝试测试 class,其中使用了 class 的最终实例。我不知道如何创建这个最终对象的模拟(在我们的示例 foo 中)。经过大量挖掘后,我开始使用 powermockito 和 whenNew 方法。由于我是 JUnits 的新手,所以我不确定我是否正确地做这件事。 看了这个之后,我将 @PrepareForTest 更改为 Sample.class(之前是 Foo.class),之后 foo 和 koo 都为空。

Class 富

public class Foo{
  void hello(){
  }
}

Class样本

public class Sample{
  private final Foo foo= new Foo();
  private Koo koo = new Koo();
  String run(){
    String strr = koo.something();
    return foo.hello();
  }
}

测试Class

@RunWith(PowerMockRunner.class)
@PrepareWith({Sample.class})
public class SampleTest{
  @InjectMocks
  private Sample sample;

  @Mock
  private Koo koo;

  @Test
  void run(){
    Foo foo = PowerMockito.mock(Foo.class);
    PowerMockito.whenNew(Foo.class).withNoArguments.thenReturn(foo);

    when(koo.something()).thenReturn("abc");
    when(foo.hello()).thenReturn("def");
    String check = sample.run();
    assertEquals("abc", check);
  }
}

foo 是一个实例变量,在实例化 Sample class 时将被初始化。如果你想使用 whenNew 模拟这个实例变量,那么它应该在测试方法执行之前加载样本 class 时发生。

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Sample.class })
public class SampleTest {

  @InjectMocks
  private Sample sample;

  @BeforeClass 
  public static void setUp() throws Exception {

    Foo foo = PowerMockito.mock(Foo.class);
    Mockito.when(foo.hello()).thenReturn("def");
    PowerMockito.whenNew(Foo.class).withNoArguments().thenReturn(foo);
  }

  @Test
  public void run() throws Exception {

    String check = sample.run();
    Assert.assertEquals("def", check);
  }
}