我需要PowerMockRunner进行一些测试,并使用第三方库,该库使用静态公共字段,这些字段可能不为空。
这有效:
@RunWith(PowerMockRunner.class)
public class TestSomething {
private ClassToTest fixture;
@Before
public void setup() {
SomeStaticClass.variable = mock(Variable.class);
fixture = new ClassToTest();
}
@Test
public void create() {
System.out.println(SomeStaticClass.variable); // prints the mock
assertNotNull(SomeStaticClass.variable); // passes
}
}
所以我决定将SomeStaticClass.variable = mock(Variable.class);
部分放入一个自己的PowerMockRunner中:
public class MyRunner extends PowerMockRunner {
public MyRunner(Class<?> klass) throws Exception {
super(klass);
SomeStaticClass.variable = mock(Variable.class);
}
}
现在这不起作用:
@RunWith(MyRunner.class)
public class TestSomethingWithMyRunner {
private ClassToTest fixture;
@Before
public void setup() {
fixture = new ClassToTest();
}
@Test
public void create() {
System.out.println(SomeStaticClass.variable); // prints null
assertNotNull(SomeStaticClass.variable); // fails
}
}
覆盖运行方法也不起作用:
@Override
public void run(RunNotifier notifier) {
SomeStaticClass.variable = mock(Variable.class)
super.run(notifier);
}
在处理测试之前,我必须在哪里挂钩,设置一些静态公共字段?
答案 0 :(得分:1)
我绝对不会这样做。
通过在静态字段和测试代码之间引入超紧密耦合来节省一点点输入是没有意义的。更糟糕的是,这种关系&#34;会非常隐藏。
我的建议:不要将内容放入Runner的子类中 - 创建一个帮助方法,您可以在需要此设置的测试用例中调用它。
你真的不希望看到你的测试的其他人很容易忽视你正在使用自己的 Runner(在封面下)进行这样的静态设置。这些事情需要明确。单元测试应该以一种非常容易理解所有&#34;准备工作的方式编写。进入每个测试用例。使用客户跑步者正在实现对面的#34;那个!
此外:你为什么一开始使用PowerMock?无论是Mockito还是EasyMock都会在这里做。