Cần giúp Unit Testing cho kiểm tra trồng rau trong game.

15/1/12
41
5
8
Mình source code như sau:

Plot.java

PHP:
package coursework.allotment;

//  ********************************************************************************
/**
*Class to represent a plot of land in the allotment game.
*/
//  ********************************************************************************

public class Plot
{
    // ----------------------- Class and object variables --------------------------

    private static int SIZE = 8;    // Number of grid cells along one side of plot.
    private SoilSample[][] grid;
    private InputRequestor input;    // For gathering user input

    // ------------------------------- Constructors --------------------------------

    public Plot()
    {
        grid = new SoilSample[8][8];

        for (int row=0; row<8; row++)
        {
            for (int col=0; col<8; col++)
            {
                grid[row][col] = new SoilSample();
            }
        }
    }

    // ---------------------------------- Methods ----------------------------------

    public void plantVegetables()
    {
        input = new TextInputRequestor();

        // set success to be True or False, displaying vegetable when success is true.
        boolean success = false;
        // Request a single turnip.
        do
        {
            System.out.println("Plant a turnip");
            input.getPlantRequest(false);
            success = setVegetable(Vegetable.TURNIP,input.getRow(),input.getCol(),input.getDirection());
        }
        while (success == false);
        display(true);

        // Request the 2 carrots to be planted
        for (int i=0; i<2; i++)
        {
            success = false;
            do
            {
                System.out.println("Plant carrot "+(i+1));
                input.getPlantRequest(true);
                success = setVegetable(Vegetable.CARROT,input.getRow(),input.getCol(),input.getDirection());
            }
            while (success == false);
            display(true);
        }

        // Request the 3 potatoes to be planted.
        for (int i=0; i<3; i++)
        {
            success = false;
            do
            {
                System.out.println("Plant potato "+(i+1));
                input.getPlantRequest(true);
                success = setVegetable(Vegetable.POTATO,input.getRow(),input.getCol(),input.getDirection());
            }
            while (success == false);
            display(true);
        }
        // Requests the 4 radishes to be planted.
        for (int i=0; i<4; i++)
        {
            success = false;
            do
            {
                System.out.println("Plant radish "+(i+1));
                input.getPlantRequest(false);
                success = setVegetable(Vegetable.RADISH,input.getRow(),input.getCol(),input.getDirection());
            }
            while (success == false);
            display(true);
        }
    }

    // Displays the allotment and any dug up cells within it, along with the number
    // of vegetable pieces in each row or column.
    // If showAll is true, all cells are shown, if false, only dug cells are shown.
    public void display(boolean showAll)
    {
        // Display the top row of column coordinates.
        System.out.print("  ");
        for (int col=0; col<8; col++)
        {
            System.out.print((col+1)+" ");
        }
        System.out.println();

        // Display the main allotment plot
        for (int row=0; row<8; row++)
        {
            System.out.print((row+1)+" ");
            int numVeggiePieces = 0;

            for (int col=0; col<8; col++)
            {
                if (grid[row][col].getVegetable() != Vegetable.EMPTY)
                {
                    numVeggiePieces++;
                }

                if ((grid[row][col].isDug()) || (showAll))
                {
                    System.out.print(grid[row][col].getVegetable().getSymbol()+" ");
                }
                else
                {
                    // This cell hasn't been dug, so don't reveal its contents.
                    System.out.print("  ");
                }
            }

            // Display number of veggie pieces in this row.
            System.out.println("|"+numVeggiePieces);

        }

        // Display bottom border.
        System.out.print("  ");
        for (int col=0; col<8; col++)
        {
            System.out.print("--");
        }
        System.out.print("\n  ");

        // Display the number of veggie pieces in each column.
        for (int col=0; col<8; col++)
        {
            int numVeggiePieces = 0;
            for (int row=0; row<8; row++)
            {
                if (grid[row][col].getVegetable() != Vegetable.EMPTY)
                {
                    numVeggiePieces++;
                }
            }
            System.out.print(numVeggiePieces+" ");
        }
        System.out.println();
    }

    /** Attempts to plant the given vegetable at the given place and direction in the plot.
    *  @param veggie Type of vegetable to plant.
    *  @param row 1-indexed row in which to plant the veggie.
    *  @param col 1-indexed column in which to plant the veggie.
    *  @param direction Direction in which the veggie grows.
    *  @return True if there was space to plant the veggie or false if the veggie could not be planted.
    */
    public boolean setVegetable(Vegetable veggie, int row, int col, Direction direction)
    {
        // Get footprint of veggie using 0-indexed coordinates.
        int[] coords = veggie.getCoords(row-1, col-1, direction);

        // Examine each piece of the veggie
        for (int i=0; i<coords.length; i+=2)
        {
            int vRow = coords[i];
            int vCol = coords[i+1];

            // Check veggie piece is within bounds.
            if ((vRow <0) || (vRow>=SIZE) || (vCol <0) || (vCol >=SIZE))
            {
                return false;
            }

            // Check the veggie has space to grow.
            if (hasGrowingSpace(vRow,vCol,veggie) == false)
            {
                return false;
            }
        }

        // If we get to this stage, there is room to plant the veggie, so plant it.
        for (int i=0; i<coords.length; i+=2)
        {
            int vRow = coords[i];
            int vCol = coords[i+1];
            grid[vRow][vCol].setVegetable(veggie);
        }

        return true;
    }

    /** Checks that there is growing space at the given cell in the grid.
    *  @param row Grid row coordinate.
    *  @param col Grid column coordinate.
    *  @return True if the given cell and its neighbours are empty.
    */
    public boolean hasGrowingSpace(int row, int col, Vegetable vegetable)
    {
        for (int rowOffset = -1; rowOffset <=1; rowOffset++)
        {
            if ((row+rowOffset >0) && (row+rowOffset < 8))
            {
                for (int colOffset = -1; colOffset <=1; colOffset++)
                {
                    if ((col+colOffset >0) && (col+colOffset < 8))
                    {
                        if (grid[row+rowOffset][col+colOffset].getVegetable() != Vegetable.EMPTY)
                        {
                            return false;
                        }
                    }
                }
            }
        }

        // If we get to this stage, there must be space to grow veggie.
        return true;
    }
}
giờ mình cần viết 1 hàm kiểm trong Unit Testing, mình ko biết viết kiểm tra trồng rau như thế nào, bạn nào có thể có hướng dẫn đc ko ? thanks rất nhìu.

phần yêu cầu là viết 1 đơn vị kiểm tra (Unit Testing) cho lớp tên là Plot(), kiểm tra xem hành vi gieo trồng có đúng ko ?
Phần làm của mình đây, mới bắt đầu nên rất sơ sài:

PHP:
package coursework.allotment;

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
* The test class PlotTest.
*
* @author  Hung Vu Pham
* @version 1
*/
public class PlotTest
{
    /**
    * Default constructor for test class PlotTest
    */
    public PlotTest()
    {
    }

    /**
    * Sets up the test fixture.
    *
    * Called before every test case method.
    */
    @Before
    public void setUp()
    {
    }

    /**
    * validate behaviors of vegetable planting
    */
    public void testPlot()
    {
        Plot testPlot = new Plot();
        //TURNIP turnip = new TURNIP();
    }

    /**
    * Tears down the test fixture.
    *
    * Called after every test case method.
    */
    @After
    public void tearDown()
    {
    }
}
mình có gửi kèm code toàn bộ lên, mong nhờ các bạn giúp đỡ dùm.
 

Attachments

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,637
310
83
Làm ơn giải thích cái lớp Plot làm gì đi.
 
15/1/12
41
5
8
đây là hình ảnh class diagram của mình:



lớp Plot này dùng chứa hàm plantVegetable(), trồng từng loại rau quả, Potato, Radish, Carrot và Turnip . Nếu trồng theo đúng loại (hàm setVegetable(x,, x, x)) thì hàm display() sẽ trình bày loại rau đc trồng lên giao diện. ngoài ra nó còn chứa giao diện vùng đất (Plot) theo hướng ngang 8 ô, dọc 8 ô.

giờ ông thầy muốn mình tạo 1 cái Unit Testing kiểm tra hành động trồng rau, đã trồng đúng ko.

vùng đất (Plot) được trồng dành cho mỗi loại rau khác nhau:
Potato => được 2 ô đất
Radish => được 4 ô đất
Carrot => được 3 ô đất
Turnip= > được 1 ô đất
 

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,637
310
83
cái method plantVegetables này return void, và cái requestor thì lại nhập từ keyboard, các phương thức của bạn thầy đều duyệt đúng hết sao???

Bởi vì các phương thức này đều bắt buộc phải có dữ liệu đầu vào mới xử lý đc, bạn lại ko để tham số đầu vào, biết viết test flow như thế nào đây???
 
15/1/12
41
5
8
cái game này ko phải là do mình làm mà đc thầy đưa ra cho mỗi người, rồi kết về viết 1 cái gọi là Unit Testing cho lớp Plot.

Mình mới nhập môn java, h viết Unit Testing thì chả biết đầu viết code như thế nào nữa (TT)

mình thử chạy game thì nhập data vào thấy ok, đúng theo trình tự code viết, cần dùng dãy số từ phím để đánh vào
 

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,637
310
83
Vấn đề ở chỗ bạn phải thiết lập các flow của chương trình, rồi thiết lập một mảng giá trị để unitTest nó chạy qua hết các flow của cái lớp Plot đó.
Nhưng bạn lại cho input bằng cách nhập và tính toán chung 1 chỗ, thay vì nên tách việc tính toán và nhập dữ liệu này ra riêng.
Bởi vậy mình mới hỏi về đám code này. Bạn có thể ask support giáo viên hướng dẫn xem???