1

get メソッドでオブジェクトのリストを返し、ページにドロップダウンを設定するコントローラーをテストしようとしています。

MockMvc と Hamcrest を使用して JUnit テストを作成しようとしています。

オブジェクトのリストを比較して、失敗するかどうかをテストしたいと思います。

Test.java でオブジェクトの静的リストを作成し、model.attribute メソッドからオブジェクトのリストを取得しています。

テストするには: オブジェクトの両方のリストが等しく、他のオブジェクトが含まれていない場合。

私のオブジェクトは Option と呼ばれ、3 つのプロパティがあります。キー、値、および選択済み。リストにすべてのキーが存在するかどうかを確認する必要があります。

同じことを行うマッチャーを作成できません。リストを比較するマッチャーを作成しようとしています。

これまでのところ、次のことを行っています。

@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]

前もって感謝します。

4

2 に答える 2

4

属性を使用してOptionオブジェクトhashCode()equals()メソッドを正しく実装すると、生活が確実に楽になります。key次に、次のように簡単に記述できます。

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

}

上記のメソッドは私の IDE によって生成されます。Optionまた、クラスの構造が正確にわからないlabelため、たとえばプロパティに加えてkeyプロパティを追加します。

于 2015-07-13T20:22:03.060 に答える
0

サイズとキーをチェックしてオプションのリストを比較するカスタム Hamcrest マッチャーを作成しました。

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

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

    };

実装は次のようになります。

private static final ImmutableBiMap<String, String> LIRA = new ImmutableBiMap.Builder<String, String>()
        .put(AccountLegislationEnum.AB.toString(), "ALBERTA")
        .put(AccountLegislationEnum.MB.toString(), "MANITTOBA")
        .put(AccountLegislationEnum.NB.toString(), "NEW BRUNSWICK")
        .put(AccountLegislationEnum.NL.toString(), "NEWFOUNDLAND")
        .put(AccountLegislationEnum.NS.toString(), "NOVA SCOTIA")
        .put(AccountLegislationEnum.ON.toString(), "ONTARIO")
        .put(AccountLegislationEnum.QC.toString(), "QUEBEC")
        .put(AccountLegislationEnum.SK.toString(), "SASKATCHEWAN")
        .put(AccountLegislationEnum.UNKNOWN.toString(), "UNKNOWN").build();

private List<Option> prepareOptions(ImmutableBiMap<String, String> map) {
    List<Option> legislations = new ArrayList<Option>();
    for (Map.Entry<String, String> entry : map.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue();
        Option option = new Option();
        option.setKey(key);
        option.setValue(value);
        legislations.add(option);
    }
    return legislations;
}


.andExpect(model().attribute("appFormLiraLegislations",hasOptionsFeatureMatcher(prepareOptions(LIRA))))
于 2015-07-15T16:05:06.433 に答える