我编写了一个JUnit测试,它使用Mockito和PowerMock来模拟一些类。我试图将其转换为Cucumber测试,但静态PowerMock功能不起作用。
两个相关黄瓜类的提取物:
转轮
@RunWith(Cucumber.class)
public class JWTValidatorBDDTest {
}
步骤类
public class JWTValidatorCukeTest {
String tokenValue;
JWTValidator jwtValidator;
MockHttpServletRequest mockRequest;
@Before
public void before() throws IOException {
this.mockRequest = new MockHttpServletRequest();
PowerMockito.mockStatic(JWTAuthConnectionManager.class);
BDDMockito.given(JWTAuthConnectionManager.postToken(anyString(), anyString(), anyString())).willReturn(200);
Mockito.doReturn(200).when(JWTAuthConnectionManager.postToken(anyString(), anyString(), anyString()));
}
@Given("^a JWT token with the value (.*)")
public void a_JWT_token_with_the_value_(String token) {
this.jwtValidator = new JWTValidator("https://test.7uj67hgfh.com/openam", "Authorization", "Bearer");
this.tokenValue = token;
}
虽然这段代码在JUnit测试中有效,但它在这里失败了——它进入了应该模拟的JWTAuthConnectionManager.postToken()
方法,然后通过执行其中的代码而失败。我试着添加行:
@RunWith(PowerMockRunner.class)
@PrepareForTest(JWTAuthConnectionManager.class)
到上面两个类(当然我不能在Runner
类中使用RunWith
,因为它已经有一个RunWith
注释),但这不会改变任何事情。
如何让PowerMock在Cucumber中工作?
现在似乎可以使用@PowerMockRunnerDelegate注释了。我使用@RunWith(PowerMockRunner.class)和@PowerMockRunerDelegate(Cucumber.class),它正在工作。从这里得到建议:https://medium.com/@WZ注释/如何制作pock-and-powermock-work-to-gether-a889e9c5692
自1.6.0版本以来,PowerMock支持在不使用JUnit规则的情况下将测试执行委派给另一个JUnit运行程序。这将实际的测试执行留给您选择的另一个运行程序。例如,测试可以委托给"SpringJUnit4ClassRunner"、"Parameterized"或"Enclosed"runner。
还有使用@Rule:PowerMockRulerule=new PowerMockRule()的选项;而不是@RunWith(PowerMockRunner.class)(所以Runner可以是其他东西)-但Stefan Birkner的评论建议Cucumber Runner应该支持使用它的规则,我不确定它是否支持(现在)。
希望它能帮助到别人。
您不能使用PowerMockRunner
,因为一个测试只能有一个运行程序(在您的情况下是Cucumber
)。但是AFAIK您可以使用PowerMockRule而不是PowerMockRunner
。