使用JSON MockHttpServletResponse测试了解mvn单元测试错误

时间:2016-03-02 10:43:31

标签: java json maven unit-testing

嗨,我对Maven完全陌生,我的Java知识很低,我的编程在其他方面很好,但我现在对这个多模Maven构建的大小感到不知所措,我正努力工作。

我正在尝试安装Maven构建SDK并在运行MVN测试时收到此错误:

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

为什么这会失败,我的假设是这应该是从曾经为我的新客户端处理服务器项目的代码继承此代码的正确测试。我真的不明白这个测试的目标是什么?有人可以开导我吗?

1 个答案:

答案 0 :(得分:0)

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

这表明预期和实​​际之间的平等失败。失败的原因是assertEquals - 它寻找完全匹配。

使用:JSONGson API进行比较。

这应该是从曾经为我的新客户端处理服务器项目后继承此代码的正确测试。

您确定它是在代码的父版本中执行的吗?根据{{​​1}}参数,default设置为false,值不会排序,也取决于Sorted input。输入订单得以维持。

不是一直硬编码输出参数的最佳做法。可以使用定义的方法here

修改

  • 如果必须维护Java对象的顺序,则可以使用Sort Keys
  • 如果您使用的是@JsonPropertyOrder api,则可以使用Serializers来定义输入/输出顺序。 Source
  • 如果您使用GSON,则可以选择维护已排序的输入顺序。 Source

然而,强烈建议不要依赖按键的顺序,不像有非常强烈的理由这样做。使用CloverETL JsonObject比排序和操作订单更为可取。