0

このコードはデータベースからデータを取得し、データの取得元の列名と注釈フィールド名を一致させます。jmock を使用した単体テストでこのコード行をカバーするにはどうすればよいですか? この問題から抜け出すのを手伝ってください。

        ArrayList<String> criticalFields = getAllCriticalField("ORD", order
                .getSrcSysId());
        if (criticalFields != null && criticalFields.size() >= 1) {
            String query = "select * from  tvs.ORD where SRC_SYS_ID='"
                    + order.getSrcSysId() + "' AND ORD_ID='"
                    + order.getOrdId() + "'";
            connection = vwsUtil.getConnection();
            statement = connection.createStatement();

            Field[] fields = Order.class.getDeclaredFields();

            for (Field field : fields) {
                field.setAccessible(true);
                if (field.isAnnotationPresent(TableColumnAnnotation.class)) {
                    TableColumnAnnotation column = field
                            .getAnnotation(TableColumnAnnotation.class);
                    if (criticalFields.contains(column.columnName())) { 
                        if (column.columnName().equalsIgnoreCase(
                                "EST_RTS_DT")
                                || column.columnName().equalsIgnoreCase(
                                        "ACT_RTS_DT")
                                || column.columnName().equalsIgnoreCase(
                                        "CMIT_SHP_DT")
                                || column.columnName().equalsIgnoreCase(
                                        "ACT_FST_SHP_DT")
                                || column.columnName().equalsIgnoreCase(
                                        "ACT_FNL_SHP_DT")
                                || column.columnName().equalsIgnoreCase(
                                        "ORD_CANC_DT")
                                || column.columnName().equalsIgnoreCase(
                                        "SHP_BEF_DT")
                                || column.columnName().equalsIgnoreCase(
                                        "SHP_AFT_DT")) {

                            if (field.get(order) == null
                                    || field.get(order).toString()
                                            .isEmpty()) {
                                query = query + " AND "
                                        + column.columnName() + " IS NULL ";
                            } else {
                                Calendar cal = (Calendar) field.get(order);
                                java.util.Date dt = cal.getTime();
                                SimpleDateFormat fmt = new SimpleDateFormat(
                                        "dd-MM-yy");
                                String sqlDate = fmt.format(dt);
                                /*query = query + " AND "
                                        + column.columnName() + "='"
                                        + sqlDate + "'";*/
                                query = query + " AND "
                                        + column.columnName() + "=to_date('"
                                        + sqlDate + "','DD-MM-YY')";

                            }
                        } else if (column.columnName().equalsIgnoreCase(
                                "ORD_TS")
                                || column.columnName().equalsIgnoreCase(
                                        "ACK_TS")) {

                            if (field.get(order) == null
                                    || field.get(order).toString()
                                            .isEmpty()) {
                                query = query + " AND "
                                        + column.columnName() + " IS NULL ";
                            } else {
                                Calendar cal = (Calendar) field.get(order);
                                java.util.Date dt = cal.getTime();
                                SimpleDateFormat fmt = new SimpleDateFormat(
                                        "dd-MM-yy HH:mm:ss.SSSSSSSSS");
                                String sqlDate = fmt.format(dt);
                                query = query + " AND "
                                        + column.columnName() + "='"
                                        + sqlDate + "'";
                                /*query = query + " AND "
                                        + column.columnName() + "=to_date('"
                                        + sqlDate + "','DD-MM-YY HH:mm:ss.SSSSSSSSS')";*/

                            }
                        } else if (column.columnName().equalsIgnoreCase(
                                "DLR_MNG_TRNSP_IND")) {
                            if (field.get(order) == null
                                    || field.get(order).toString()
                                            .isEmpty()) {
                                query = query + " AND "
                                        + column.columnName() + " IS NULL ";
                            } else {
                                query = query + " AND "
                                        + column.columnName() + "="
                                        + field.get(order).toString();
                            }

                        } else {
                            if (field.get(order) == null
                                    || field.get(order).toString()
                                            .isEmpty()) {

                                query = query + " AND "
                                        + column.columnName() + " IS NULL ";
                            } else {
                                query = query + " AND "
                                        + column.columnName() + "='"
                                        + field.get(order).toString() + "'";

                            }
                        }
                    }
                }
            } //System.out.println("Order Query  =  "+query);
            resultSet = statement.executeQuery(query);

            if (!resultSet.next()) {System.out.println("Flag true  in Order   ");
                criticalFieldFlag = true;
            }
        }
4

1 に答える 1

1

具体的にどのような問題が発生しているのかはわかりませんが、このコードは理解しにくく、現在の形式で単体テストを行うのは困難です。

この獣を個別の責任にリファクタリングすれば、あなたの人生はとても楽になります。

コードの大部分は、SQL 文字列を生成しているように見えます。これは、引き出された後、独立して簡単にテストできるはずの 1 つの粗い責任です。

SQL 生成が取り出されると、データベースとの対話のテストがはるかに簡単になります。

もちろん、安全にリファクタリングするにはテストが必要です。

コードの現在の構造では、単体テストの作成が困難になっています。したがって、開始する前に、多くの統合テスト カバレッジを配置することをお勧めします。つまり、このコードを実行してデータベースにアクセスするテストです。

于 2013-08-07T14:40:28.740 に答える