当前位置: 首页 > 知识库问答 >
问题:

使用Spring、JUNIT、MockMvc和Hamcrest测试控制器

别永年
2023-03-14

我试图测试我的一个控制器,它返回给我一个get方法上的对象列表,以填充我页面上的下拉列表。

我试图使用MockMvc和Hamcrest编写一个JUnit测试来测试相同的内容。

我想比较对象列表,并测试它是否失败。

@Before
public void setup() throws Exception {
    // This would build a MockMvc with only the following controller
    this.mockMvc = MockMvcBuilders.standaloneSetup(openAccountController)
            .build();
}

@Test
public void testOpenAccount() {
    try {
        setAllLegislations();
        this.mockMvc
                .perform(get("/open_account.htm"))
                // This method is used to print out the actual httprequest
                // and httpresponse on the console.
                .andDo(print())
                // Checking if status is 200
                .andExpect(status().isOk())
                .andExpect(
                        model().attributeExists("appFormAccountPlans",
                                "appFormLiraLegislations",
                                "appFormLrspLegislations",
                                "appFormRlspLegislations"))
                .andExpect(
                        model().attribute("appFormAccountPlans", hasSize(5)))
                .andExpect(
                        model().attribute("appFormLiraLegislations",
                                hasSize(8)))
                .andExpect(
                        model().attribute("appFormLrspLegislations",
                                hasSize(2)))
                .andExpect(
                        model().attribute("appFormRlspLegislations",
                                hasSize(1)))
                .andExpect(
                        model().attribute(
                                "appFormLiraLegislations",
                                hasKeyFeatureMatcher(getLiraLegislations(allLegislations))));


private Matcher<List<Option>> hasKeyFeatureMatcher(
        final List<Option> expectedOptions) {
    return new FeatureMatcher<List<Option>, List<Option>>(
            equalTo(expectedOptions), "Options are", "was") {

        @Override
        protected List<Option> featureValueOf(List<Option> actualOptions) {
            boolean flag = false;
            if (actualOptions.size() == expectedOptions.size()) {
                for (Option expectedOption : expectedOptions) {
                    for (Option actualOption : actualOptions) {
                        if (expectedOption.getKey().equals(
                                actualOption.getKey())) {
                            flag = true;
                        } else {
                            flag = false;
                            break;
                        }
                    }
                }
            }
            if (flag)
                return actualOptions;
            else
                return null;
        }
    };
}

private List<Option> getLiraLegislations(List<Option> legislation) {

    List<Option> liraLegislations = new ArrayList<Option>();
    Iterator<Option> iterator = legislation.iterator();
    while (iterator.hasNext()) {
        Option option = iterator.next();
        if (LIRA_LEGISLATIONS.contains(option.getKey())) {
            liraLegislations.add(option);
        }
    }
    return liraLegislations;
}

private List<Option> allLegislations;

public List<Option> getAllLegislations() {
    return allLegislations;
}

public void setAllLegislations() {
    allLegislations = new ArrayList<Option>();
    for (String key : ALL_LEGISLATIONS) {
        Option option = new Option();
        option.setKey(key);
        allLegislations.add(option);
    }
}

private static final Set<String> ALL_LEGISLATIONS = new HashSet<String>(
        Arrays.asList(AccountLegislationEnum.AB.toString(),
                AccountLegislationEnum.MB.toString(),
                AccountLegislationEnum.NB.toString(),
                AccountLegislationEnum.NL.toString(),
                AccountLegislationEnum.NS.toString(),
                AccountLegislationEnum.ON.toString(),
                AccountLegislationEnum.QC.toString(),
                AccountLegislationEnum.SK.toString(),
                AccountLegislationEnum.BC.toString(),
                AccountLegislationEnum.FE.toString(),
                AccountLegislationEnum.NT.toString(),
                AccountLegislationEnum.PE.toString(),
                AccountLegislationEnum.YT.toString(),
                AccountLegislationEnum.NU.toString(),
                AccountLegislationEnum.UNKNOWN.toString()));

这就是我获取模型属性的方式:

 Attribute = appFormLiraLegislations
           value = [com.abc.arch.core.gui.eform.gui.Option@199d1739, com.abc.arch.core.gui.eform.gui.Option@185fac52, com.abc.arch.core.gui.eform.gui.Option@312a47fe, com.abc.arch.core.gui.eform.gui.Option@4edc8de9, com.abc.arch.core.gui.eform.gui.Option@71e8e471, com.abc.arch.core.gui.eform.gui.Option@70edf123, com.abc.arch.core.gui.eform.gui.Option@15726ac1, com.abc.arch.core.gui.eform.gui.Option@abeafe7]

提前谢了。

共有1个答案

郭志泽
2023-03-14

当您使用key属性正确实现optionobjecthashcode()equals()方法时,您的生活肯定会更轻松;然后你可以简单地写:

model().attribute("appFormLiraLegislations",getLiraLegislations(allLegislations)))

并依赖list1.equals(list2)方法来完成这项工作。

选项hashcodeequals实现:

public class Option {

    private String key;
    private String label;

    ...

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((key == null) ? 0 : key.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Option other = (Option) obj;
        if (key == null) {
            if (other.key != null)
                return false;
        } else if (!key.equals(other.key))
            return false;
        return true;
    }

}
 类似资料:
  • 正在使用Spring MVC创建Restful Web服务... 下面是我的pom.xml: WEB-INF/web.xml: web-inf/mvc-dispatcher-servlet.xml: src/main/resources/database_db.xml: @Repository public class UserDAO{ } SRC/Test/Java: 这就像在print()语句

  • 我试图使用spring和mockito对rest控制器进行单元测试。这是我的主控制器方法。 这是我的JUnit测试: 在输出响应中,测试失败,因为它得到404错误,但它预期成功代码为200。我相信我已经正确设置了独立配置,我会做错什么。为什么URI没有正确映射到方法?请注意,对于来自应用程序前端的相同URI,它工作正常。以下是我使用Postman工具为chrome测试的正确200响应的完整URI:

  • 我需要jUnit测试的帮助,我的结果是json文件,我需要测试该文件的长度,问题是在jsonPath函数中没有这样的方法。 这里是我的测试方法,预期长度是7。如有任何帮助,我将不胜感激,谢谢

  • 问题内容: 我正在使用spring 3.2.0和junit 4 这是我需要测试的控制器方法 spring-servlet config is: This is my test class : 如何使用MockMvc测试此方法? 问题答案: 你可以使用以下注释来使用应用程序调度程序servlet xml。以下示例使用路径/ mysessiontest设置了一些会话属性并期望返回某个视图来命中控制器:

  • null null null 更新2015-06-12:Mockito 1.10.19和2.0.13-beta仍然使用Hamcrest 1.1

  • ObjectBean类 所以我的问题是:我如何使用Spring mockMVC测试这个方法?