当前位置: 首页 > 知识库问答 >
问题:

如何抑制和验证私有静态方法调用?

窦啸
2023-03-14

我目前在JUnit测试中遇到了障碍,需要一些帮助。所以我用静态方法得到了这个类,它将重构一些对象。为了简化起见,我举了一个小例子。这是我的工厂课程:

class Factory {

    public static String factorObject() throws Exception {
        String s = "Hello Mary Lou";
        checkString(s);
        return s;
    }

    private static void checkString(String s) throws Exception {
        throw new Exception();
    }
}

这是我的测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Factory.class })        
public class Tests extends TestCase {

    public void testFactory() throws Exception {

        mockStatic(Factory.class);
        suppress(method(Factory.class, "checkString"));
        String s = Factory.factorObject();
        assertEquals("Hello Mary Lou", s);
    }
}

基本上,我试图实现的是私有方法check String()应该被抑制(因此不会抛出异常),并且还需要验证方法check String()实际上是在方法factorObject()中调用的。

更新:抑制正常工作,代码如下:

suppress(method(Factory.class, "checkString", String.class));
String s = Factory.factorObject();

... 但是,它为字符串“s”返回NULL。为什么呢?

共有2个答案

夏侯英纵
2023-03-14

哟可以这样做:

PowerMockito.doNothing().when(Factory.class,"checkString");

有关更多详细信息,请访问:
http://powermock.googlecode.com/svn/docs/powermock-1.3.7/apidocs/org/powermock/api/mockito/PowerMockito.html

编辑:

ClassToTest spy = spy(new ClassToTest ());
doNothing().when(spy).methodToSkip();
spy.methodToTest();
昌和悦
2023-03-14

好的,我终于找到了解决所有问题的办法。如果有人偶然发现类似问题,以下是代码:

import junit.framework.TestCase;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.times;
import static org.powermock.api.support.membermodification.MemberModifier.suppress;
import static org.powermock.api.support.membermodification.MemberMatcher.method;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Factory.class)
public class Tests extends TestCase {

    public void testFactory() throws Exception {

        mockStatic(Factory.class, Mockito.CALLS_REAL_METHODS);
        suppress(method(Factory.class, "checkString", String.class));
        String s = Factory.factorObject();
        verifyPrivate(Factory.class, times(1)).invoke("checkString", anyString()); 
        assertEquals("Hello Mary Lou", s);      
    }
}
 类似资料:
  • 我想知道是否有一种方法来验证和调用一个模拟,该模拟是为一个私有静态方法创建的,该私有静态方法是从一个被测试的公共静态方法调用的。 下面是我正在测试的公共静态方法 我已经使用powermokito对私有静态方法进行了如下嘲弄:

  • 如何验证是否调用了私有嵌套类的非静态方法?这就是我目前的情况: 我明白了: 更新1: @丹尼斯,我试过以下方法,不过我得到了一个。我想根据JVM中已经存在的单例验证方法的运行,而不是创建它的新实例(正如我在下面的代码中所做的那样),以便调用方法。我尝试调用,但没有成功。有没有一种方法可以使用外部类的运行实例上的反射来验证jmockit中对私有嵌套类中非静态方法的调用(通过调用)? 更新2: 尝试获

  • 问题内容: 我想调用一个私有静态方法。我有名字 我听说可以使用Java反射机制来完成。我该怎么做? 编辑: 我在尝试调用该方法时遇到的一个问题是如何指定其参数的类型。我的方法收到一个参数,其类型为Map。因此,我不能这样做(在运行时,由于Java Type擦除,没有Map这样的东西)。是否有另一种方法来获得该方法? 问题答案: 假设您要调用MyClass.myMethod(int x);

  • 我试图验证在使用powerMockito 1.6.4测试服务方法时从未调用过静态方法 我按照这个答案做了同样的事情。 以下是我的代码。 我现在面临的问题是,调用real并给出nullPointerException。 我的假设是与一起工作,以便指定要验证的静态方法。 我错过什么了吗?

  • 问题内容: 我正在使用以下内容。 这是我的utils课 这是被测课程的要点: 这是测试: 以上测试失败。给出的验证模式为空,但根据代码,如果订购成功,则必须发送电子邮件。 问题答案: 如果您要嘲笑行为(类似),则实际上无需调用。也就是说,这是我重写测试方法的动力: 我分为四个部分,以更好地突出显示正在发生的事情: 1.变量 我选择在此处声明任何实例变量/方法参数/模拟协作者。如果它在多个测试中使用

  • 暴露的问题: 我想修改一些静态字段android.os.构建,如android.os.构建。董事会,android.os.构建。设备,android.os.构建。显示。 构建中有3个私有静态方法(私有静态字符串getString(String属性)、私有静态字符串[]getStringList(String属性、字符串分隔符)、私有静态long getLong(String属性))。Java语言