【问题标题】:mock constructor and super injected field with PowerMockito使用 PowerMockito 模拟构造函数和超级注入字段
【发布时间】:2015-12-07 12:17:05
【问题描述】:

我希望示例代码 sn-ps 足以重建我的问题。

我有一个类TreeWalker 和一个子类ABCTreeWalker extends TreeWalker。 我使用 Spring 依赖注入,在 @​​987654323@ 中我有一个依赖 Helper helper;,它受到保护,因此在 ABCTreeWalker 中也可用。像 helper 这样的所有依赖项都使用 Springs @Autowired 进行字段注入,因此没有设置器。

public class TreeWalker {

    @Autowired
    protected Helper helper;
}


public class ABCTreeWalker extends TreeWalker {

    @Override
    public void doSomething() {
        String something = helper.getSomething();
        InstanceModel instanceModel = new InstanceModel(something);
        // ... more stuff ...
    }
}

我需要为 ABCTreeWalker 类创建一个单元测试,我需要在其中做两件事:

  • helper 的模拟注入到我的ABCTreeWalker 类中 测试
  • 模拟构造函数调用

我的测试使用@RunWith(PowerMockRunner.class) 运行,它允许使用@InjectMocks@Mock 注释注入helper。但是:为了准备构造函数模拟,我需要准备被测类 ABCTreeWalker 和注释 @PrepareForTest(ABCTreeWalker.class)。如果我这样做,注入将不再发生(我猜是因为它来自超类)。

@RunWith(PowerMockRunner.class)
@PrepareForTest(ABCTreeWalker.class)
public class ABCTreeWalkerTest {

    @InjectMocks
    private ABCTreeWalker abcTreeWalker;

    @Mock
    private Helper helper;

    @Test
    public void testVisitGui() throws Exception {
        // ... more stuff ...
        when(helper.getSomething()).thenReturn("test");
        InstanceModel instanceModel = mock(InstanceModel.class);
        PowerMockito.whenNew(InstanceModel.class)
             .withArguments("test")
             .thenReturn(instanceModel);
        // ... more stuff ...

        abcTreeWalker.doSomething(); // execute

        // assertions etc.
 }

那我现在能做什么?

  • 我可以将helper 注入我的ABCTreeWalker,但这是多余的
  • 我可能可以创建一个 setter,但这仅用于测试
  • 由于构造函数模拟,我无法重新启动 Powermock

你们有什么建议吗?

【问题讨论】:

  • 没有@PrepareForTest(ABCTreeWalker.class)你会得到什么
  • 然后注入工作,但我不能再模拟构造函数调用了。

标签: java unit-testing junit dependency-injection powermockito


【解决方案1】:

你有没有想过 @Autowired 构造函数

public class TreeWalker {
protected Helper helper;

@Autowired
public TreeWalker(Helper helper){
    this.helper = helper;
}

} 然后在child的构造函数中调用super()?

【讨论】:

  • 我只能更改子类,超类来自 maven 依赖。我致力于“标准产品”的“定制解决方案”,我无法更改后者。
  • 对不起,我放错类了。构造函数可以用于 ABCTreeWalker 类。 public class ABCTreeWalker { @Autowired public ABCTreeWalker (Helper helper){ this.helper = helper; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多