为什么junit测试在eclipse中失败但是从ant传递?

时间:2009-03-11 14:40:56

标签: java eclipse junit

我有一个JUnit测试正在检查以确保自定义的xml序列化正常工作。定制的xml序列化只是Xstream的一些自定义转换器。反序列化器有效,但由于某些原因,在Eclipse 3.x中,JUnit无法进行序列化。在命令行的Ant中,它工作得很好。如果我调试并逐步执行测试用例,它在Eclipse中也可以正常工作,但如果在失败的测试用例执行后放置一个断点,它仍会失败。

是什么给出的?我有类路径问题吗?

其他一些信息:

预期:

<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();
   }
}

PointUnitConversions调用执行明显的数学计算,取十进制度数并转换为组件部分的相应整数或双精度值。

它只是导致失败的最后一个位置属性。

3 个答案:

答案 0 :(得分:3)

如果调试它可以正常工作吗?听起来像是时间问题;并调试它减慢它足以工作。你能发一些代码吗?

编辑:
感谢您添加信息。似乎如果它没有失败,当你单步执行它,但如果你只是正常运行它会失败,我敢打赌它的时间/线程问题。你是在某个线程的某个地方做这个吗?有争议吗?还是竞争条件?

答案 1 :(得分:2)

有些不同。

无法根据您发布的内容判断,但我的猜测可能是:

  1. Ant,命令shell和Eclipse使用的不同JVM,
  2. Ant和Eclipse的CLASSPATH中的不同JAR,
  3. 不同的XML编码。

答案 2 :(得分:0)

可能与使用的XML库不同。找出使用的例如这个小代码:

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