零星行为没有捕获任何参数值!使用PowerMockito SpringBoot的用于静态NewRelic的ArgumentCaptor

时间:2018-07-17 15:45:51

标签: unit-testing spring-boot powermock newrelic powermockito

将NewRelic自定义参数添加到日志记录库的关键部分。 嘿,我应该添加测试以验证是否正确调用了。 编写了一些测试来验证和为NewRelic()使用ArgumentCaptor,有时它们可​​以工作。有时候,他们没有。使用intellij,gradle,SpringBoot(1.4.2)。

compile group: 'com.newrelic.agent.java', name: 'newrelic-api', version: '3.26.1'
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.6.5'
testCompile group: 'org.powermock', name: 'powermock-api-mockito', version: '1.6.5'

问题:

随机PowerMockito.mockStatic(NewRelic.class);无法捕获参数。

CODE

测试使用以下代码段:

@RunWith(PowerMockRunner.class)
@PrepareForTest({NewRelic.class})
public class NewRelicAddCustomParameterWrapperTest {
@Before
public void setUp() throws Exception {
PowerMockito.mockStatic(NewRelic.class);
PowerMockito.spy(NewRelic.class);
} 
@Test
public void addCustomParam() throws Exception {
//GIVEN
String key = "woopsie-doo1";
String value = "tippyConue";
PowerMockito.spy(NewRelic.class);
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<String> captor2 = ArgumentCaptor.forClass(String.class);
PowerMockito.doNothing().when(NewRelic.class, "addCustomParameter", captor.capture(), captor2.capture());
//WHEN
newRelicAddCustomParameterWrapper.addCustomParam(key, value);
//THEN
String resourceKey = captor.getValue();

'NewRelicAddCustomParameterWrapper`类是包装NewRelic调用的简单方法:

public void addCustomParam(final String key, final String value) {
// Create a component to wrapper the static NewRelic
try {
NewRelic.addCustomParameter(key, value);
} catch (Exception newRCustomException) {
newRCustomException.printStackTrace();
}
}

会发生什么症状行为:

  1. 在大多数情况下运行单个测试时,
  2. 如果运行全部5个测试组,则PowerMockito的测试失败(仅Mockito的测试通过)
  3. 在“调试”模式下运行它们时,请在任何位置放置一个停止点,并保持一致
  4. 在运行调试模式时,不会中断,随机会像运行模式一样失败。

-错误

No argument value was captured!在以下代码行中:  String resourceKey = captor.getValue();

控制台中的错误代码段:

  

您可能忘记了在verify()中使用arguments.capture()...   ...或者您在存根中使用了capture(),但存根方法不是   叫。请注意,建议仅将capture()与   verify()

     

正确捕获参数的示例:       ArgumentCaptor参数= ArgumentCaptor.forClass(Person.class);       verify(mock).doSomething(argument.capture());       assertEquals(“ John”,参数.getValue()。getName());

     

org.mockito.exceptions.base.MockitoException:没有参数值   被抓!您可能已经忘记在其中使用arguments.capture()   verify()... ...或在存根但存根方法中使用了capture()   没有被调用。请注意,建议仅使用capture()   与verify()

-思想与问题:

  • 尝试在所有地方添加Thread.sleep(900)无济于事。大声笑:)
  • 调试没有帮助,因为它可以工作。
  • Is there a conflict between PowerMockito & Mockito?
  • Is PowerMock better PowerMockito: which should I be using?
  • 调试应跳转到.when方法时MockGateway会执行类似模拟方法的操作。
  • 在项目
  • 上重新运行gradle clean
  • PowerMockito和Mockito之间的此类加载冲突吗?怎么算?

我花了太多时间在这上面。这是重要的一段代码,需要良好的测试覆盖率。 任何想法,想法,建议如何进行。

github上的简单示例项目: CODE LINK: New Relic PowerMockito static unit test of NewRelic.addCustomParameter(key, value);

0 个答案:

没有答案