模拟类和接口

如何解决模拟类和接口

您好,到目前为止,我一直在尝试在测试中使用模仿。 这是我的问题:我可以模拟一个接口,以便实现该接口的每个类的行为都与模拟中描述的一样吗?

这是我正在测试的方法:

public static boolean initNewCluster(ServerConfiguration conf) throws Exception {
    return runFunctionWithRegistrationManager(conf,rm -> {
        try {
            return rm.initNewCluster();
        } catch (Exception e) {
            System.out.println("MOCK WORKS!!! \n");
            throw new UncheckedExecutionException(e.getMessage(),e);
        }
    });
}

我需要模拟调用rm.initNewCluster()。 现在,这是使用initNewCluster()作为方法的接口:

@LimitedPrivate
@Evolving
public interface RegistrationManager extends AutoCloseable {

    

    /**
     * Initializes new cluster by creating required znodes for the cluster. If
     * ledgersrootpath is already existing then it will error out.
     *
     * @return returns true if new cluster is successfully created or false if it failed to initialize.
     * @throws Exception
     */

    boolean initNewCluster() throws Exception;

这是实现此接口的类:

    /**
     * ZooKeeper Based {@link RegistrationManager}.
     */
    @Slf4j
    public class ZKRegistrationManager implements RegistrationManager {
    
        private static final Function<Throwable,BKException> EXCEPTION_FUNC = cause -> {
            if (cause instanceof BKException) {
                log.error("Failed to get bookie list : ",cause);
                return (BKException) cause;
            } else if (cause instanceof InterruptedException) {
                log.error("Interrupted reading bookie list : ",cause);
                return new BKInterruptedException();
            } else {
                return new MetaStoreException();
            }
        };
    
        private final ServerConfiguration conf;
        private final ZooKeeper zk;
        private final List<ACL> zkAcls;
        private final LayoutManager layoutManager;
    
        private volatile boolean zkRegManagerInitialized = false;
    
        // ledgers root path
        private final String ledgersRootPath;
        // cookie path
        private final String cookiePath;
        // registration paths
        protected final String bookieRegistrationPath;
        protected final String bookieReadonlyRegistrationPath;
        // session timeout in milliseconds
        private final int zkTimeoutMs;
    
        public ZKRegistrationManager(ServerConfiguration conf,ZooKeeper zk,RegistrationListener listener) {
            this(conf,zk,ZKMetadataDriverBase.resolveZkLedgersRootPath(conf),listener);
        }
    
        public ZKRegistrationManager(ServerConfiguration conf,String ledgersRootPath,RegistrationListener listener) {
            this.conf = conf;
            this.zk = zk;
            this.zkAcls = ZkUtils.getACLs(conf);
            this.ledgersRootPath = ledgersRootPath;
            this.cookiePath = ledgersRootPath + "/" + COOKIE_NODE;
            this.bookieRegistrationPath = ledgersRootPath + "/" + AVAILABLE_NODE;
            this.bookieReadonlyRegistrationPath = this.bookieRegistrationPath + "/" + READONLY;
            this.zkTimeoutMs = conf.getZkTimeout();
    
            this.layoutManager = new ZkLayoutManager(
                zk,ledgersRootPath,zkAcls);
    
            this.zk.register(event -> {
                if (!zkRegManagerInitialized) {
                    // do nothing until first registration
                    return;
                }
                // Check for expired connection.
                if (event.getType().equals(EventType.None)
                    && event.getState().equals(KeeperState.Expired)) {
                    listener.onRegistrationExpired();
                }
            });
        }
    
.
.
.
.
.
.
    
    
       
    
        @Override
        public boolean initNewCluster() throws Exception {
            System.out.println("I have been called ! \n");
            String zkServers = ZKMetadataDriverBase.resolveZkServers(conf);
            String instanceIdPath = ledgersRootPath + "/" + INSTANCEID;
            log.info("Initializing ZooKeeper metadata for new cluster,ZKServers: {} ledger root path: {}",zkServers,ledgersRootPath);
    
            boolean ledgerRootExists = null != zk.exists(ledgersRootPath,false);
    
            if (ledgerRootExists) {
                log.error("Ledger root path: {} already exists",ledgersRootPath);
                return false;
            }
    
            List<Op> multiOps = Lists.newArrayListWithExpectedSize(4);
    
            // Create ledgers root node
            multiOps.add(Op.create(ledgersRootPath,EMPTY_BYTE_ARRAY,zkAcls,CreateMode.PERSISTENT));
    
            // create available bookies node
            multiOps.add(Op.create(bookieRegistrationPath,CreateMode.PERSISTENT));
    
            // create readonly bookies node
            multiOps.add(Op.create(
                bookieReadonlyRegistrationPath,CreateMode.PERSISTENT));
    
            // create INSTANCEID
            String instanceId = UUID.randomUUID().toString();
            multiOps.add(Op.create(instanceIdPath,instanceId.getBytes(UTF_8),CreateMode.PERSISTENT));
    
            // execute the multi ops
            zk.multi(multiOps);
    
            // creates the new layout and stores in zookeeper
            AbstractZkLedgerManagerFactory.newLedgerManagerFactory(conf,layoutManager);
    
            log.info("Successfully initiated cluster. ZKServers: {} ledger root path: {} instanceId: {}",instanceId);
            return true;
        }
    
        
    }

这是我的考试课:

package org.apache.bookkeeper.client;


import org.apache.bookkeeper.conf.ServerConfiguration;
import org.apache.bookkeeper.discover.RegistrationManager;
import org.apache.bookkeeper.discover.ZKRegistrationManager;
import org.apache.bookkeeper.meta.LayoutManager;
import org.apache.bookkeeper.test.BookKeeperClusterTestCase;
import org.apache.bookkeeper.test.ZooKeeperCluster;
import org.apache.bookkeeper.test.ZooKeeperUtil;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.mockito.InjectMocks;
import org.mockito.Mock;



import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;


@RunWith(value= Parameterized.class)
public class BookKeeperAdminInitNewClusterTest extends BookKeeperClusterTestCase {

    private boolean result;
    private ServerConfiguration conf;
    private String confType ;

    private static final int numOfBookies = 2;
    private final int lostBookieRecoveryDelayInitValue = 1800;


    @Mock
    RegistrationManager mockedRM = mock(RegistrationManager.class) ;
  


    @Parameterized.Parameters
    public static Collection<Object[]> getTestParameters(){
        return Arrays.asList(new Object[][]{

                //last parameter states if the method rm.initNewCluster() called inside
                // BookKeeperAdmin.initNewCluster(conf) must be mocked or not

                //{true,"new" },//{false,"null" },"wrong"},{false,"mock"},//caso di test introdotto per portare la branch coverage al 100%
                                    // entrando nella clausola catch del metodo initNewCluste()

        });

    }



    public BookKeeperAdminInitNewClusterTest(boolean result,String conf) throws Exception {

        super(numOfBookies,480);
        baseConf.setLostBookieRecoveryDelay(lostBookieRecoveryDelayInitValue);
        baseConf.setOpenLedgerRereplicationGracePeriod(String.valueOf(30000));
        setAutoRecoveryEnabled(true);

        this.result = result;
        this.confType = conf;


    }

    @Test
    public void testInitNewCluster() throws Exception {

        boolean realResult ;


        if(confType == "null"){

            this.conf = null;

        }else if( confType == "wrong"){

            this.conf = new ServerConfiguration().setMetadataServiceUri("zk+hierarchical://127.0.0.1/ledgers");

        }else if(confType == "new") {

            this.conf = new ServerConfiguration(baseConf);
            String ledgersRootPath = "/testledgers";
            this.conf.setMetadataServiceUri(newMetadataServiceUri(ledgersRootPath));

        }else if(confType == "mock"){



            this.conf = new ServerConfiguration(baseConf);
            String ledgersRootPath = "/testledgers";
            this.conf.setMetadataServiceUri(newMetadataServiceUri(ledgersRootPath));
   

            when(mockedRM.initNewCluster()).thenThrow(new Exception());



        }


        try {

            realResult = BookKeeperAdmin.initNewCluster(conf);

        } catch (Exception e) {
            realResult = false ;
            e.printStackTrace();

        }
        assertEquals(result,realResult);
    }

}`

问题是当BookKeeperAdmin.initNewCluster(conf)被调用时,它导致实现方法initNewCluster()的调用,而不是我嘲笑的那个! 希望大家能帮忙,大家好!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-