2017-06-13 110 views
0

我最近在研究Mockito和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")); 

     } 
    } 

结果:空123156458

为什么呢?以及如何匹配字符串...

回答

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

+0

明白了,但是我无法找到任何调用的方法,无论参数如何 –

+0

是的,我也搜索了,它似乎并不存在。有一种方法可以为你的任何模拟方法添加一个默认的答案,但是我找不到所有方法重载的自动模拟。 – Konstantine