如何在不初始化的情况下模拟内部成员 class

How to mock internal members without initializing class

我想为以下内容编写单元测试class:

public class Target() {

    private final Member member = new Member();

    public Target() {
    } 

}

我想用模拟的 Member 实例初始化此 Target class,因为在测试期间实例化 Member 是不可行的。任何框架都可以吗?

编辑:

我不想模拟 Target class。我打算在初始化的时候mock Memberclass

Object method() {
    member.differentMethod();
    //Logic which I want to test
}

请建议如何模拟此调用成员 class 的方法。

您应该将 Target class 使用的 Member 实例传递给 Target class 的构造函数。

通过这样做,您可以在生产环境中使用您成员 class 的实现,并在测试环境中使用另一个实现(可能为空)。

最好和最优的解决方案是使用依赖性Inversion/Injection原则

您可以使用 constructor mocking with Powermock:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Target.class)
public class Test {
    @Test
    public void doSomething() throws Exception {
        Member mockMember = mock(Member.class);
        PowerMockito.whenNew(Member.class).thenReturn(mockMember);
        Target thisTargetWillHaveYourMockAsField = new Target();
        //Your test code
    }
}

要建立 Prim 的答案(已投票),只需给自己两个构造函数。

public class Target() {

  private final Member member;

  public Target() {
    this.member = new Member();
  }

  /** Testing constructor. Package-private visibility for tests in the same package. */
  Target(Member member) {
    this.member = member;
  }    
}

通过提供多个构造函数,您可以确保生产中的消费者根本不需要更改。这也是与 "testing code polluting production" 不同的情况:您的 use-cases 之一(特别是测试)需要成员的自定义实现,并且您正在提供 most-encapsulated 访问权限以替换该成员按照规格。

另请参阅: How to use Mockito when we cannot pass a mock object to an instance of a class