2016-03-02 110 views
0

嗨,我对Maven是全新的,我的Java知识很低,我的编程在其他领域很好,但我有点不知所措,目前这种多模式的大小Maven构建我是试图工作。了解mvn单元测试错误与JSON MockHttpServletResponse测试

我试图运行MVN测试时,安装Maven构建SDK和收到此错误:

Tests run: 4, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.194 sec <<< FAILURE! 
testWriteWithMap(eu.sdk.util.JsonWriterTest) Time elapsed: 0.181 sec <<< FAILURE! 
junit.framework.ComparisonFailure: null expected:<{"[b":12,"c":123,"a":"test1"]}> but was:<{"[a":"test1","b":12,"c":123]}> 
    at junit.framework.Assert.assertEquals(Assert.java:81) 
    at junit.framework.Assert.assertEquals(Assert.java:87) 
    at junit.framework.Assert$assertEquals$0.callStatic(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:53) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:157) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:169) 
    at eu.digient.sdk.util.JsonWriterTest.testWriteWithMap(JsonWriterTest.groovy:28) 

testConvert2JsonStrWithMap(eu.sdk.util.JsonWriterTest) Time elapsed: 0.001 sec <<< FAILURE! 
junit.framework.ComparisonFailure: null expected:<{"[b":12,"c":123,"a":"test1"]}> but was:<{"[a":"test1","b":12,"c":123]}> 
    at junit.framework.Assert.assertEquals(Assert.java:81) 
    at junit.framework.Assert.assertEquals(Assert.java:87) 
    at junit.framework.Assert$assertEquals$0.callStatic(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:53) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:157) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:169) 
    at eu.digient.sdk.util.JsonWriterTest.testConvert2JsonStrWithMap(JsonWriterTest.groovy:85) 

我已经查明错误的测试文件,发现测试功能在这里:

@Test 
    public void testWriteWithMap() { 
     MockHttpServletResponse response = new MockHttpServletResponse(); 
     Map<String, Object> jsonBean = new HashMap<String, Object>(); 

     jsonBean.put("a", "test1"); 
     jsonBean.put("b", 12); 
     jsonBean.put("c", new BigDecimal(123)); 

     try { 
      JsonWriter.write(response, jsonBean); 

      assertEquals("{\"b\":12,\"c\":123,\"a\":\"test1\"}", response.getContentAsString()); 
     } catch (HttpMessageNotWritableException e) { 
      fail("fail"); 
     } catch (IOException e) { 
      fail("fail"); 
     } 
    } 

为什么这个失败,我的假设是这应该是正确的测试,从一个曾经在我的新客户端的服务器项目上工作的代码继承。我真的不明白这个测试目标是什么时候?请问有人能给我启迪吗?

回答

0
junit.framework.ComparisonFailure: null expected:<{"[b":12,"c":123,"a":"test1"]}> but was:<{"[a":"test1","b":12,"c":123]}> 

这表明预期与实际之间的等同性失败。失败后的原因是assertEquals - 它寻找完全匹配。

用途:JSONGson用于比较的API。

这应该是正确的测试,从一个曾经在我的新客户端的服务器项目上工作的代码继承了此代码。

您确定它是在父版本的代码中执行的吗?根据Sorted input参数,默认设置为false,且值不排序,也取决于Sort Keys。输入顺序保持不变。

不是最佳实践来硬编码输出参数的所有时间。可以使用定义的方法here

编辑:

  • 如果Java对象的顺序必须保持@JsonPropertyOrder可以使用。
  • 如果您使用的是GSON api,则可以使用串行器来定义输入/输出顺序。 Source
  • 如果您使用CloverETL为您提供维护排序后的输入订单的选项。 Source

然而,强烈建议不要依赖于按键的顺序,而不是有非常强的理由这样做。使用JsonObjectcontainsKey()比排序和操作顺序更优选。

+0

对不起,我在这里很笨,但是这是哪里? “根据Sorted输入参数”我假设我可以定义未分类与已排序。这是为了assertEquals检查吗? – Beloudest

+0

这就是为什么我实际上感到困惑 - 为什么junit测试的比较顺序不同?如果它一直是错误的等... – Beloudest

+0

请参阅'编辑' – VinayVeluri