我正在尝试测试具有静态方法的实用程序类,其中大多数是静态方法并返回可选。许多其他对象和参数都作为我使用 Mockito 模拟的参数传递。我正在使用 PowerMock 调用静态方法。 问题是当我在实际调用我想要测试的方法后使用验证时,即 MyUtil.getJob(JobManager, "_TEST_dummy_JOBGROUP",Optional.of("CWB-4"));
它没有调用它应该调用的另一个方法。即
JobUtil.testDummy();;
下面粘贴的控制台错误
我尝试模拟谓词,并在您评论测试中的第一行时给出真正的谓词。 我尝试调用 when..then 并对它进行评论并调用 real method 。 但没有成功。 请忽略代码中的任何拼写错误,因为我刚刚创建了虚拟。
MyUtilTest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyUtil.class)
public class MyUtilTest {
@Mock
JobManager JobManager;
@Mock
Job Job;
@Mock
JobMetadata JobMetadata;
@Mock
private Predicate<Map.Entry<Job, JobMetadata>> predicate;
@InjectMocks
MyUtil MyUtil = new MyUtil();
private ArgumentCaptor<Job> JobArgument = ArgumentCaptor.forClass(Job.class);
@Test
public void testGetJobGroupPredicate() {
//Predicate<Map.Entry<Job, JobMetadata>> jobGroupMatcher = MyUtil.getJobGroupPredicate(jobMeta -> eq("TEST_dummy_JOBGROUP").startsWith(jobMeta));
PowerMockito.mockStatic(MyUtil.class);
when(MyUtil.getJobGroupPredicate(j->"_TEST_dummy_JOBGROUP".startsWith(j))).thenReturn(predicate);
when(JobUtil.testDummy()).thenReturn("called");
try {
MyUtil.getJob(JobManager, "_TEST_dummy_JOBGROUP", Optional.of("TEST-4"));
}
catch(Exception e){}
PowerMockito.verifyStatic(MyUtil.class);
MyUtil.testDummy();;
}
MyUtil.java
public class MyUtil {
public static Optional<Job> getJob(final JobManager jobManager,
final String jobGroup,
Optional<String> feature) throws PlatformClientException {`
String test=MyUtil.testDummy();
Predicate<Map.Entry<Job, JobMetadata>> jobGroupMatcher = getJobGroupPredicate(jobMeta -> jobGroup.startsWith(
jobMeta));
return getWithPredicate(jobManager, jobGroupMatcher, feature);
}
static String testDummy() {
return "helloooooo";
}
}
想要但未调用 de.dummy.cloud.wh.jobs.utils.MyUtil.testDummy();
但是,与此mockde.dummy.cloud.wh.jobs.utils.MyUtil.getJob( JobManager 的 Mock,hashCode:1871312485, “_TEST_dummy_JOBGROUP”, 可选[TEST-4] ); 。 想要但未调用 de.dummy.cloud.wh.jobs.utils.MyUtil.testDummy();
但是,与此mockde.dummy.cloud.workbench.jobs.utils.MyUtil.getJob( JobManager 的 Mock,hashCode:1871312485, “_TEST_dummy_JOBGROUP”, 可选[TEST-4] );
最佳答案
对于 Mockito,即使谓词具有相同的实现,它们也是不同的实例,并且它不能仅与您的情况匹配。
您可以尝试使用通配符并接受任何谓词
:
when(any(Predicate.class)).thenReturn(predicate);
如果这还不够,您很可能需要使用自定义的 ArgumentMatcher
来动态检查传入的谓词:
when(argThat(new MyPredicateMatcher())).thenReturn(predicate);
关于java - 需要但未调用 - 从带有谓词参数的另一个静态方法调用静态方法时 Powermock 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56489251/