Java 如何模拟内部调用的方法?

Java 如何模拟内部调用的方法?,java,mockito,Java,Mockito,下面是我试图为其编写文本大小写的代码,并添加了我所做的操作,但得到了空指针exp public boolean doVersionLimitCheck(Long mneId) throws DMMException { CALogUtil.getInstance().logMethodEntry("doVersionLimitCheck", ConfigArchiveManagerImpl.class.getName()); boolean status

下面是我试图为其编写文本大小写的代码,并添加了我所做的操作,但得到了空指针exp

public boolean doVersionLimitCheck(Long mneId) throws DMMException {
    CALogUtil.getInstance().logMethodEntry("doVersionLimitCheck",
            ConfigArchiveManagerImpl.class.getName());
    boolean status = false;
    status = validateArchivedVersions(mneId);
    CALogUtil.getInstance().logDebug("Version Roll over status::" + status);
    CALogUtil.getInstance().logMethodExit("doVersionLimitCheck",
            ConfigArchiveManagerImpl.class.getName());
    return status;
}
为此,我喜欢下面的内容

@Test
public void testDoVersionLimitCheck() {

    Long mneId=Long.valueOf("123");
    ConfigArchiveManagerImpl impl = new ConfigArchiveManagerImpl();
    try {
        Mockito.doReturn(true).when(Mockito.mock(ConfigArchiveManagerImpl.class)).validateArchivedVersions(Mockito.anyLong());
    } catch (DMMException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        impl.doVersionLimitCheck(mneId);
    } catch (DMMException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

为了测试一种方法并模拟另一种方法,您需要监视SUT:

@Test
public void testDoVersionLimitCheck() {

    Long mneId=Long.valueOf("123");
    ConfigArchiveManagerImpl impl = Mockito.spy(new ConfigArchiveManagerImpl());
    try {
        Mockito.doReturn(true).when(impl ).validateArchivedVersions(Mockito.anyLong());
    } catch (DMMException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

使用依赖注入。与私有方法
validateArchivedVersions
不同,您将向方法(或类构造函数)传递具有相同名称的公共方法的某个对象。然后可以模拟该对象。如果模拟方法的内部行为,则不再测试任何内容。validateArchivedVersions是publc method only检查方法与Mockito的工作方式不同-它只在时修改传递给
的模拟实例,而不是“真实的”
impl
一个您正在调用的
doVersionLimitCheck
方法。在公共方法中调用同一类的公共方法通常会在单元测试期间导致此类问题。我看到了两个不错的选择:按照Michael的建议将它移动到另一个类,或者不要模仿它。@mae特别是如果它很大,模仿它可能很危险——也许它有一些副作用,这对类的整体功能很重要?如果您希望避免与真正的资源交互,那么最好尝试向这个
ConfigArchiveManagerImpl
类注入某种
MockArchive
。(假设此ArchiveManager实际管理一个归档,即…)