如何声明接口类型的变量,然后将实现接口的类的对象分配给该变量,以及如何对其进行测试?

问题描述 投票:0回答:1

我正在努力实现它们所实现的类和接口之间的交互。具体来说,当类的构造函数需要参数时,如何声明接口类型的变量,然后将实现接口的类的对象分配给该变量。我是基于规范来实现的,因此不能仅添加不需要参数的构造函数。

我有一个构造函数,需要2个参数和getter方法:

public class exampleImpl implements example{

    private int var1;
    private int var2;

    public exampleImpl(int var1, int var2) {
        if(var2< 0) {
            var1 = 1;
            var2 = 1;
        }

    public int getVar1(){
        return Var1;
    }
    public int getVar2(){
        return Var2;
    }

然后我有一个方法“ manipulate”,它[[必须将接口作为输入并将其作为输出返回:

public example manipulate(example e) { example eInst = (exampleImpl)e; int newVar1 = (this.getVar1()*eInst.getVar2() + this.getVar2()*eInst.getVar1()); int newVar2 = this.getVar2()*eInst.getVar2(); Pair<Integer, Integer> pair = normaliseExample(newVar1, newVar2); int normalisedNewVar1 = pair.getKey(); int normalisedNewVar2 = pair.getValue(); example summedE = new exampleImpl(normalisedNewVar1, normalisedNewVar2); return summedE; }
接口本身仅将此方法定义为:

public interface example extends Example { public example manipulate(example e); }

我的方法在声明接口示例的变量然后为该变量分配一个实现示例的exampleImpl对象方面是否有效?它还必须返回类型为example的变量,但是这种情况发生时我不知道newVar1和newVar2在哪里,因为它们未在接口中定义。

[我还需要使用JUnit 4测试此方法,并且由于无法实例化类型为example的对象,所以我完全不知道如何执行此操作,因此如何传递参数,例如:

class exampleImplTest { @Test public exampleImpl testManipulate() { assertEquals(example,exampleImpl.manipulate(example(3,4))); }

这会显示错误,因为操作不是静态方法,但是当它需要一个对象(this)才能工作时如何使其成为静态方法?我可以在测试类中创建一个对象来调用此测试吗?我想检查它是否基于对象“ this”和新对象“ e”返回正确的操作。有办法吗?

很抱歉,如果有人误解这个问题,我是一个完整的初学者。我很难理解如何使用接口,因为规范要求我在这里使用它们。任何帮助将不胜感激。

java junit4
1个回答
0
投票

((我将使用大写字母表示类和接口名称的开头)

我的方法在声明接口example的变量方面然后将实现example的exampleImpl对象分配给该变量是否有效?

是,但是在这种情况下,不需要它,而且无论如何您都不应该这样做。您假定通过参数e到达的对象将始终是ExampleImpl实例,因为您对该变量进行了硬编码转换。如果不是这样的课程,您将获得一个ClassCastException。在这种情况下,您可以删除

Example eInst = (ExampleImpl)e;

行并使用变量e

它还必须返回示例类型的变量,但由于在接口中未定义它们,因此我不知道newVar1和newVar2发生在哪里。

您已经编写了代码

Example summedE = new ExampleImpl(normalisedNewVar1, normalisedNewVar2); return summedE;

将返回一个对象,该对象实现Example接口。所以这里一切都很好。如果要使用newVar1newVar2取决于您的实现和对manipulate方法的要求。

我可以在测试类中创建一个对象来调用此测试吗?

是的,这是正常的做法。写

Example obj = new ExampleImpl(4, 5);

在您的测试方法中创建可以使用的Example对象。您可以使用不同的manipulate()对象调用Example方法,如下所示:

Example obj = new ExampleImpl(4, 5); Example obj2 = new ExampleImpl(10, 20); Example obj3 = obj.manipulate(obj2);

我想检查它是否基于对象“ this”和新对象“ e”返回正确的操作。有办法吗?

这取决于在Example接口上定义了哪些其他方法。您已经写到它是从另一个名为Example的接口扩展而来的。根据

that

接口中定义的内容,您可以像这样在Example对象上调用其他方法: Assert.assertEquals(42, obj3.getDifference()); // or whatever other methods you have
© www.soinside.com 2019 - 2024. All rights reserved.