如何匹配String ...使用Mockito和PowerMock

时间:2017-06-13 08:00:25

标签: mockito junit4 powermock

我最近正在研究Mockito和PowerMock。

我遇到了以下问题

    //This method belongs to the Messages class
    public static String get(Locale locale, String key, String... args) {
        return MessageSupplier.getMessage(locale, key, args);
    }
    //the new class
    @RunWith(PowerMockRunner.class)
    @PowerMockIgnore( {"javax.management.*"})
    @PrepareForTest({Messages.class, LocaleContextHolder.class})
    public class DiscreT {

        @Test
        public void foo() {

            PowerMockito.mockStatic(LocaleContextHolder.class);
            when(LocaleContextHolder.getLocale()).thenReturn(Locale.ENGLISH);

            PowerMockito.mockStatic(Messages.class);
            when(Messages.get(Mockito.any(Locale.class),Mockito.anyString(), Mockito.any(String[].class)))
                    .thenReturn("123156458");

            System.out.print(Messages.get(LocaleContextHolder.getLocale(), "p1"));

            System.out.print(Messages.get(LocaleContextHolder.getLocale(), "p1", "p2"));

        }
    }
  

结果:null 123156458

为什么呢?以及如何匹配String ...

1 个答案:

答案 0 :(得分:0)

在您的第一个System.out.print语句中,您使用Messages.get方法的2个参数。这是您模拟的方法的重载之一。这就是它返回null的原因。请注意,默认情况下,未模仿其行为的对象模拟将返回null。

如果你想让它工作,你必须嘲笑Messages.get(Locale, String)方法

when(Messages.get(Mockito.any(Locale.class),Mockito.anyString()))
                    .thenReturn("123156458");

请记住,你嘲笑采用最多参数的方法并不意味着Mockito理解并嘲笑其余的重载!你也必须嘲笑他们。

根据我所知,没有办法模拟一个方法并自动模拟它的所有重载,但有一种方法可以创建一个模拟对象并为其所有方法配置默认响应。查看http://www.baeldung.com/mockito-mock-methods#answer