java - 需要但未调用 - 从带有谓词参数的另一个静态方法调用静态方法时 Powermock 出错

标签 java junit mockito powermock

我正在尝试测试具有静态方法的实用程序类,其中大多数是静态方法并返回可选。许多其他对象和参数都作为我使用 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/

相关文章:

java - 模拟系统类时的 Mockito + PowerMock LinkageError

java - 如何知道@RequestMapping的哪个参数被调用

java - 我可以用java代码解决数据库并发问题吗?

java - 将 JSON 数组[array[String]] 转换为 Java 数组

java - 使用 PostgreSQL 数据库作为简单键值存储的最佳方式

java - @RunWith(DataProvider.class) 时 @Before 不会被执行

java - setup() 中变量的值未更改

gradle - 如何从 Gradle 订购单元测试执行?

java - 如何测试和模拟递归方法?

java - 单元测试困境