そうシナリオのためのユニットテストを作成し、それがトラブルの価値がありますか?

アンジェリーナ:

方法以下の場合は、原因にユニットテストを作成する方法がありますDatatypeConfigurationExceptionので、私はそれが投げたことをテストすることができますかConversionException

ここに私のコードは次のとおりです。

public static XMLGregorianCalendar getXMLGregorianCalendar(final LocalDate localDate) {
    XMLGregorianCalendar xmlGregorianCalendar = null;
    if (localDate != null) {
        final String dateString = localDate.format(yyyMMddFormat);
        try {
            xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(dateString);
        } catch (DatatypeConfigurationException e) {
            throw new ConversionException("Unable to format LocalDate.", e);
        }
    }

    return xmlGregorianCalendar;
}
davidxxx:

ここでチェック例外はによってスローされますjavax.xml.datatype.DatatypeFactory.newInstance()
これは、静的メソッドです。だから、まっすぐそれを嘲笑することはできません。

1)別の方法として、あなたは上昇することが例外を引き起こす可能性がシナリオを見つけることを試みることができます。
行こう。例外は、ここにスローです。

private static <T> T findServiceProvider(final Class<T> type)
        throws DatatypeConfigurationException{
    try {
        return AccessController.doPrivileged(new PrivilegedAction<T>() {
            public T run() {
                final ServiceLoader<T> serviceLoader = ServiceLoader.load(type);
                final Iterator<T> iterator = serviceLoader.iterator();
                if (iterator.hasNext()) {
                    return iterator.next();
                } else {
                    return null;
                }
            }
        });
    } catch(ServiceConfigurationError e) {
        final DatatypeConfigurationException error =
                new DatatypeConfigurationException(
                    "Provider for " + type + " cannot be found", e);
        throw error;
    }
}

だから、DatatypeConfigurationExceptionときにスローされるServiceConfigurationErrorスローとキャッチされます。しかし、ServiceConfigurationErrorエラーではなく例外です。
エラーをシミュレートしようとすると、非常にハックになります。

2)他の代替は、それをテストするには:ラッピングをDatatypeFactory.newInstance()独自のクラスのインスタンスで。
この方法では問題なく、それを模擬することができます:

public class DataTypeFactoryWrapper { 
   public DatatypeFactory newInstance(){
      return DatatypeFactory.newInstance();
   }
}

さて、このようにコードを変更:

private DataTypeFactoryWrapper dataTypeFactoryWrapper;

//...
xmlGregorianCalendar = dataTypeFactoryWrapper.newInstance().newXMLGregorianCalendar(dateString);

今、あなたはモックができdataTypeFactoryWrapper、あなたのテストクラスに。

3)最終選択肢:それをテストしていません。それはつまり、あるとして、それを考えてみましょうErrorラッパーとErrorテストにトリッキー/ハードです。
javadocツールは、その説明してどのような:

エラーは、合理的なアプリケーションは、キャッチすべきではないという重大な問題を示すThrowableのサブクラスです。ほとんどのこのようなエラーは異常な状態です

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=186624&siteId=1