我应该测试返回的类型是否与所需的类型一致? (多态性)

时间:2018-08-20 13:10:10

标签: java unit-testing junit

我不知道自己的考试是否适当,我是否在想好方法。我有一个工厂模式。有ConverterContext返回给定类的所需对象。

public<K extends Converter> K getConverter(Class<K> converterClass){
    if(converterClass == null){
        throw new IllegalArgumentException();
    }
    Optional<Converter> converter = converters.stream().filter(converterClass::isInstance).findFirst();
    return (K) converter.orElse(null);
}

使用示例:

Converter converter = converterContext.getConverter(ConverterRegisterUserDto.class);

我可以通过两种方式对其进行测试:
1。

@Test
void getConverter_returnConverterRegisterUserDto() {
    //WHEN
    Converter converter = converterContext.getConverter(ConverterRegisterUserDto.class);
    //THEN
    assertTrue(ConverterRegisterUserDto.class.isInstance(converter));
}

2。

@Test
void getConverter_returnConverterRegisterUserDto() {
    //WHEN
    ConverterRegisterUserDto converter = converterContext.getConverter(ConverterRegisterUserDto.class);
    //THEN
    assertTrue(ConverterRegisterUserDto.class.isInstance(converter));
}

我认为在这种想法下测试类是有问题的。正确的方法是什么?

2 个答案:

答案 0 :(得分:1)

选择哪种方法测试方法,结果将相同。我可以肯定的是,在几乎所有情况下(除了更改getConverter签名之类的东西之外),两种测试方法都将失败或都将成功。

传递给该方法的Class实例将用于确定K是什么。在两种测试方式中,您都传递相同的Class实例,因此K是相同的。由于返回值类型为K,因此将以两种测试方式返回相同类型的实例。这意味着无论您将converter声明为Converter还是ConverterRegisterUserDto都没有关系。返回值的类型将是 ConverterRegisterUserDto

以上所有假设getConverter的签名不变。如果更改getConverter使其返回Converter并使其他所有内容保持不变,则第二种测试方式将由于不编译而失败。

因此,请根据您是否希望在不小心更改签名的情况下测试失败来决定测试该方法的方式。

关于未经检查的演员表:

不用担心未经检查的演员表。在您当前的getConverter版本中,未经检查的强制转换将始终成功,因为您事先检查过converterClass::isInstance。编译器太笨了,无法弄清楚。如果您更改方法的主体,它可能并不总是成功。这就是您编写测试的原因之一!为了避免意外更改和破坏它。

答案 1 :(得分:0)

由于该函数的签名,因此实际上在类型级别上是安全的。

但是,返回表达式中的不安全类型转换存在问题。因此,无论哪种测试,它都将在失败之前崩溃。