2009-03-11 4 views
1

カスタマイズされたxmlシリアル化が正しく機能していることを確認するためのJUnitテストがあります。カスタマイズされたxmlシリアル化は、Xstream用のカスタムコンバータのほんの一部です。デシリアライザは機能しますが、Eclipse 3.xでは何らかの理由でJUnitがシリアル化に失敗します。コマンドラインのAntでは、うまくいきます。テストケースをデバッグしてステップ実行すると、Eclipseでもうまく動作しますが、テストケースが実行された後にブレークポイントを置くと、テストは失敗します。なぜjunitテストはeclipseで失敗しますが、antからはパスしますか?

何がありますか?クラスパスの問題がありますか?

いくつかの追加情報:予想

:実際

<site> 
    <name>origin</name> 
    <version>0.6.0</version> 
    <description>Stuff</description> 
    <source>./fake-file.xml</source> 
    <location> 
    <latitude deg="44" min="26" sec="37.640"/> 
    <longitude deg="-57" min="-38" sec="-6.877"/> 
    <ellipsoid-height value="-79.256" units="meters"/> 
    <geoid-height value="0.000" units="meters"/> 
    </location> 
</site> 

<site> 
    <name>origin</name> 
    <version>0.6.0</version> 
    <description>Stuff</description> 
    <source>./fake-file.xml</source> 
    <location> 
    <latitude deg="44" min="26" sec="37.640"/> 
    <longitude deg="-57" min="-38" sec="-6.877"/> 
    <ellipsoid-height value="-79.256" units="meters"/> 
    <geoid-height value="-79.256" units="meters"/> 
    </location> 
</site> 

場所フィールドを書き込むコード:

public void marshal(Object source, 
        HierarchicalStreamWriter writer, 
        MarshallingContext context) 
{ 
    ILatLonEllipsoidHeightPoint aLoc = (ILatLonEllipsoidHeightPoint) source; 
    synchronized(aLoc) 
    { 
     writer.startNode(LATITUDE); 
     writer.addAttribute(DEGREES, 
     Integer.toString(
      PointUnitConversions.getLatitudeHours(aLoc.getLatitude()))); 
     writer.addAttribute(MINUTES, 
     Integer.toString(
      PointUnitConversions.getLatitudeMinutes(aLoc.getLatitude()))); 
     writer.addAttribute(SECONDS, 
     String.format("%.3f", 
      PointUnitConversions.getLatitudeSeconds(aLoc.getLatitude()))); 
     writer.endNode(); 

     writer.startNode(LONGITUDE); 
     writer.addAttribute(DEGREES, 
     Integer.toString(
      PointUnitConversions.getLongitudeHours(aLoc.getLongitude()))); 
     writer.addAttribute(MINUTES, 
     Integer.toString(
      PointUnitConversions.getLongitudeMinutes(aLoc.getLongitude()))); 
     writer.addAttribute(SECONDS, 
     String.format("%.3f", 
      PointUnitConversions.getLongitudeSeconds(aLoc.getLongitude())));  
     writer.endNode(); 

     writer.startNode(ELLIPSOID_HEIGHT); 
     writer.addAttribute(VALUE, 
     String.format("%.3f", aLoc.getEllipsoidHeight())); 
     writer.addAttribute(UNITS, METERS); 
     writer.endNode();  

     writer.startNode(GEOID_HEIGHT); 
     writer.addAttribute(VALUE, 
     String.format("%.3f", aLoc.getGeoidHeight())); 
     writer.addAttribute(UNITS, METERS); 
     writer.endNode(); 
    } 
} 

PointUnitConver sions呼び出しは明示的な計算を行い、小数点以下の桁数を取得し、コンポーネントの部分の対応する整数値またはdouble値に変換します。

障害を引き起こしているロケーションの最後の属性。

答えて

3

デバッグしても問題ありませんか?タイミングの問題のように聞こえます。それをデバッグするだけで十分に動作が遅くなります。いくつかのコードを投稿できますか?

編集:
ありがとうございます。もしあなたがそれを踏んだときに失敗しなかったら、それを正常に実行すれば失敗するようですが、私はそのタイミング/スレッディングの問題を賭けるでしょう。どこかのスレッドでこれをやっていますか?いくつかの競合はありますか?競争状態ですか?

+0

絶対に競合状態があります。 aLoc.getGeoidHeight()の呼び出しは、私が実現した以上に多くのことを行います。この問題は、実行されるテストの順序によって発生します。 Eclipseは、明らかにランダムな順序でテストスイート全体を実行しますが、Ant順序が定義されています。 –

+0

私は助けてくれてうれしいです。 JUnit setup()およびteardown()を使用して、各テストを実行する前に初期条件を試してリセットする必要があります。それはすべてのテストが以前の条件から独立していることを確認します –

+0

ありがとうございました!私は問題の原因となっているものを見つけるためにすべてのテストケースを通して自分の道を進んでいます。問題はsetup()にあり、静的メンバーで変更された後、teardown()メソッドでリセットされません。 –

2

何かが違います。

は、あなたが投稿した内容に基づいて言うことができないが、私の推測があるかもしれない:アリ、コマンドシェル、とEclipse、AntとEclipse用のCLASSPATHで

  • 別のJARファイルによって使用される

    1. 異なるJVM 、
    2. 異なるXMLエンコーディング。
  • 0

    おそらく同じXMLライブラリが使用されていません。たとえば、この小さなコードを使用しているものを調べてください。

    import org.w3c.dom.Text; 
    public class TextTest { 
        public static void main(String[] args) { 
         System.out.println(Text.class.getResource("Text.class")); 
        } 
    }