java - Mockito - 方法内的测试方法

标签 java unit-testing junit mockito powermockito

我正在尝试测试我的 Utils 类。有些方法使用其他类方法。我想模拟内部方法的使用,以便测试假设它们有效(为了使其成为真正的单元测试,测试特定的方法)。

我想测试“buildUrl”方法:

 public static String buildUrl(String path, List<Pair> queryParams, DateFormat dateFormat) {
    final StringBuilder url = new StringBuilder();
    url.append(path);

    if (queryParams != null && !queryParams.isEmpty()) {
        // support (constant) query string in `path`, e.g. "/posts?draft=1"
        String prefix = path.contains("?") ? "&" : "?";
        for (Pair param : queryParams) {
            if (param.getValue() != null) {
                if (prefix != null) {
                    url.append(prefix);
                    prefix = null;
                } else {
                    url.append("&");
                }
                String value = Utils.parameterToString(param.getValue(), dateFormat);
                url.append(Utils.escapeString(param.getName())).append("=").append(Utils.escapeString(value));
            }
        }
    }

    return url.toString();
}

BuildUrl 使用“parameterToString”(和其他),我想模拟它进行测试。所以我尝试了这样的事情:

 @Test
public void testBuildUrl(){
    Utils util = new Utils();
    Utils utilSpy = Mockito.spy(util);
    Mockito.when(utilSpy.parameterToString("value1",new RFC3339DateFormat())).thenReturn("value1");
    List<Pair> queryParams = new ArrayList<Pair>();
    queryParams.add(new Pair("key1","value1"));
    String myUrl = utilSpy.buildUrl("this/is/my/path", queryParams, new RFC3339DateFormat());
    assertEquals("this/is/my/path?key1=value1&key2=value2", myUrl);
}

但是我从 Mockito 收到 MissingMethodInvocableException 。 所以我的问题实际上是 - 如何模拟已在测试方法中调用的方法,以及我的测试出了什么问题。谢谢。

最佳答案

您无法使用标准 Mockito 模拟/监视静态调用。

您必须使用 Powermockito 和以下内容:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Utils.class)    
public class MyClassTest{

    @Test
    public void testBuildUrl(){
         PowerMockito.mockStatic(Utils.class);

         // mock the static method to return certain values
         Mockito.when(Utils.parameterToString("value1",new RFC3339DateFormat()))
             .thenReturn("value1");
         Mockito.when(Utils.escapeString(anyString()).thenReturn(desiredResult);

       // rest of test code
    }

这里还有一些需要阅读的内容 -> powermockito static

关于java - Mockito - 方法内的测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42554907/

相关文章:

c# - 如何在 ASP.NET Core 中测试自定义操作过滤器?

java - stub() 和 when() 有什么区别?

java - 方法类型的 Spring REST 最佳实践

java - 使用带有 JList 和静态数组的 ActionListener

java - JFileChooser 图像到缓冲图像

java - 测试 onActivityResult()

java - junit:使用mockmvc测试 Controller 时注入(inject)bean上的NullPointer

java - 项目中的代码打包后如何编写调用Jar文件的Maven脚本?

python - 单元测试 - 测试字典相等性

python - 如何测试访问数据库的其他线程