使用Mockito在JUnit-Controller-Unit Test中忽略@JsonIgnore

时间:2014-02-12 15:51:23

标签: spring unit-testing maven junit jackson

我构建了我的第一个Spring-Controller单元测试,一个Controller以JSON格式返回一个对象。关系用@JsonIgnore注释,它可以在我的软件中使用。

当我只想测试那些控制器时,我将总是在该属性上得到无限递归错误。这是一个1:1的关系。在其他关系上,@ JsonIgnore没有任何问题。

错误测试:   save(package.a.b.c.test.ControllerATest):请求处理失败;嵌套异常是org.springframework.http.converter.HttpMessageNotWritableException:无法写入JSON:无限递归(StackOverflowError)(通过引用链:package.abcentity.A [“b”] - > package.abcB [“a”]等...

看起来像我的@JsonIgnore在测试范围内被忽略了?

这是一个Maven管理的项目,所以我包括这样的

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

也许,有人也有同样的经历?

2 个答案:

答案 0 :(得分:0)

是字段上的注释还是它们的吸气剂? Jackson默认只查看getter,因此将注释移动到getter将解决问题。例如:

class Person {
    @JsonIgnore
    Set<Department> departments;

    public Set<Department> getDepartments() { return this.departments; }
}

class Department {
    @JsonIgnore
    Set<Person> persons;

    public Set<Person> getPersons() return this.persons; }
}
如果PersonDepartment对象相互引用,

将导致无限递归。

以下内容可行:

class Person {
    Set<Department> departments;

    @JsonIgnore
    public Set<Department> getDepartments() { return this.departments; }
}

class Department {
    Set<Person> persons;

    @JsonIgnore
    public Set<Person> getPersons() return this.persons; }
}

答案 1 :(得分:0)

我刚刚发现,它与物体中的双向1:1关系有关。切换到具有以下依赖项的较新版本2.3.1解决了该问题:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.3.1</version>
    </dependency>