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

在不改变另一个人的类的情况下,我如何要求它使用我的Scanner版本(作为内部类埋置)而不是java.util.Scanner?

鞠自明
2023-03-14

为了好玩(也为了在课堂上作为教学工具使用),我正在编写一个类似于JUnitTests的程序。我想用它来对高中生写的代码运行测试。当一个学生编写通过系统获得用户输入的代码时,在使用扫描仪时,我想“劫持”扫描仪来提供我自己预定的用户输入。我有一切工作很好,除了我的愿望,我的扫描仪是一个内部类的自动测试仪。

下面的例子过于简单,但却能理解这一点。

假设一个学生写了这样的代码:

import java.util.*;
public class Practice {  
    public static void practiceScanners()  {
        Scanner console = new Scanner(System.in);                 
        System.out.print("Type first name, age, and address >> ");
        String name = console.next();
        int age = console.nextInt();
        String address = console.nextLine();
        System.out.println(name + " is " + age + " and lives at" + address + ".");
    }
}
public class AutoTester {

    public main() {
        * use JavaCompiler from ToolProvider to compile Practice.java
        * use reflection to invoke Practice.practiceScanners()
             * (hopefully) have student code use my Scanner instead of java.util.Scanner
             * collect output of running the student code 
             * compare against expected output
    }

    //My version of Scanner is an inner class within AutoTester
    public class Scanner { 
        private String script = "Bob 13 42 Maple Drive";
        <* implementation not shown *>    
    }

}

共有1个答案

邵璞
2023-03-14

不幸的是,不是这样的。自定义扫描器的类名实际上是autotester.scanner,您在测试类中定义了它,除了类似的名称之外,它与java.util.scanner没有任何关系。所以这一点也不会影响practice

您必须重新构造practice代码,以便使用@inject(例如,使用CDI)作为扫描器工作。然后使用mockito(@mock,@injectmocks)连接扫描仪。不过,那是很多重型机械。作为另一种选择,您可以设计practice,使其将扫描程序作为构造函数参数或属性。

但是,您仍然有问题,扫描器是一个最终类,不能扩展。因此,您必须为此引入自己的接口,在一种情况下将java.util.Scanner放在引擎盖下,在另一种情况下将您的替代扫描器放在另一种情况下。

 类似资料: