首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用JUnit测试

通用JUnit测试
EN

Stack Overflow用户
提问于 2014-03-18 23:35:50
回答 1查看 5.4K关注 0票数 3

我有一个抽象的泛型集合类GCollection,还有一个扩展称为GStack的类。

为了测试实现,我有一个抽象的JUnit测试类,我对每个GCollection实现都进行了扩展:

代码语言:javascript
复制
public abstract class GCollectionTest<T extends GCollection<E>, E> {
    private GCollection<? extends Object> collection;
    protected abstract GCollection<T> createInstance();

    @Before
    public void setup() throws Exception {
        collection = createInstance();
    }

    // Tests down here. 

这样的扩展如下:

代码语言:javascript
复制
public class GStackCollectionInterfaceTest<S extends GCollection<E>> {
    protected GDSStack<? extends Object> createInstance() {
        return new GDSStack<String>();
    }
}

我首先使用持有GStackString对象进行测试,然后用Date对象重新运行测试,以确保它与不同的对象类型一起工作。

代码语言:javascript
复制
@Test
public void testIsEmpty() {
    assertTrue(collection.isEmpty()); // Fresh Stack should hold no objects
    collection.add(new String("Foo")); // Error here.
    assertFalse(collection.isEmpty());
}

给出的错误是:

方法添加(捕获#24-of?GCollection类型中的扩展对象)不适用于参数(字符串)

我对错误的理解是,我不能将String对象放入GCollection<T extends GCollection<E>>对象,但我认为这不是我想要做的。

我做错了什么?

如何在维护尽可能通用的测试的同时解决此错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-19 00:56:18

集合的类型是GCollection<? extends Object>。不可能向此集合添加任何内容,请参阅:can't add value to the java collection with wildcard generic type

子类中不需要通配符或界,因此可以简化泛型。类似于:

代码语言:javascript
复制
abstract class GCollectionTest<T> {
    protected Collection<T> collection;

    protected abstract Collection<T> createCollection();
    protected abstract T createObject();

    @Before
    public void setup() throws Exception {
        collection = createCollection();
    }

    @Test
    public void testIsEmpty() {
        assertTrue(collection.isEmpty());
        collection.add(createObject());
        assertFalse(collection.isEmpty());
    }
}

class GStackCollectionInterfaceTest extends GCollectionTest<String> {
    protected GDSStack<String> createCollection() {
        return new GDSStack<String>();
    }

    protected String createObject() {
        return new String("123");
    }
}

由于泛型类型允许在集合中使用不同的类型,并由编译器检查,所以它实际上不需要测试。我只需要测试不同的容器类型,但是您可以创建另一个使用Date而不是String的子类。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22493327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档