如何在MVC中为模型创建junit测试

时间:2018-03-24 17:08:56

标签: java junit

我是第一次使用MVC框架,我想了解一下jUnit测试,我已将我的主项目添加到新软件包中,并且我试图实现我的jUnit测试所在的项目的新测试包。

我的模型类是对大量课程说话的类,所以我认为最好先对它进行junit测试。那么我该如何进行简单的测试和建立呢?

模型类

public class GateInfoDatabase extends Observable {

    /**
     *  A constant: the number of aircraft gates at the airport.
     */
    public int maxGate = 3;
    private Gate[] gates = new Gate[maxGate];

    public GateInfoDatabase(){
        Gate gate0 = new Gate(0);
        Gate gate1 = new Gate(1);
        Gate gate2 = new Gate(2);

        gates[0] = gate0;
        gates[1] = gate1;
        gates[2] = gate2;
    }

    /**
     * Obtain and return the status of the given gate identified by the gateNumber parameter.
     * @return 
     */
    public Gate getGate(int gateNumber){
        Gate result = gates[gateNumber];
        return result;
    }
    /**
     * Obtain and return the status of the given gate identified by the gateNumber parameter.
     * @return 
     */
    public Gate getGateByMCode(int mCode){
        Gate result = null;
        for(int i = 0; i < gates.length; i++) {
            if(mCode == gates[i].getmCode()) {
                result = gates[i];
                System.out.print(result);
            }
        }
        return result;
    }
    /**
     * Obtain and return the status of the given gate identified by the gateNumber parameter.
     * @return 
     */
    public int getStatus(int gateNumber){

        return gates[gateNumber].getStatus();
    }
    /**
     * Obtain and return the status of the given gate identified by the gateNumber parameter.
     * @return 
     */
    public int getStatusByMCode(int mCode){
        int nStatus = ManagementRecord.FREE;
        Gate result = getGateByMCode(mCode);
        if(result!=null) {
            nStatus = result.getStatus();
        }
        return nStatus;
    }
    /**
     * Returns an array containing the status of all gates.
     * For data collection by the GOC.
     */
    public int[] getStatuses(){

        int[] statuses = new int[maxGate];

        for(int i = 0; i < maxGate; i++){

            statuses[i] = gates[i].getStatus();
        }
        return statuses;
    }

    /**
     * Forward a status change request to the given gate identified by the gateNumber parameter. Called to allocate a free gate to the aircraft identified by mCode.
     */
    public void allocate(int gateNumber, int mCode){

        gates[gateNumber].allocate(mCode);
        setChanged();
        notifyObservers(); 

    }

    /**
     * Forward a status change request to the given gate identified by the gateNumber parameter. Called to indicate that the expected aircraft has arrived at the gate.
     */
    public void docked(int gateNumber){
        gates[gateNumber].docked();
        setChanged();
        notifyObservers(); 
    }

    /**
     * Forward a status change request to the given gate identified by the gateNumber parameter. Called to indicate that the aircraft has departed and that the gate is now free.
     */
    public void departed(int gateNumber){
        gates[gateNumber].departed();
        setChanged();
        notifyObservers(); 
    }

    public int getmCode(int gateNumber){

        return gates[gateNumber].getmCode();
    }

}

测试课,由于有3个门,我想返回3。

public class GateTest {



            GateInfoDatabase model = new GateInfoDatabase();

            @Before
            public void setUp() throws Exception {
            model = new GateInfoDatabase();
            }
            @After
            public void tearDown() throws Exception {
            model = null;
            }
            @Test
            public void testCreate() {
            assertNotNull("Model not created properly", model);
            assertEquals("Initial gate setup is wrong",
              model.maxGate, model.getStatuses().length);
            }


    }

1 个答案:

答案 0 :(得分:0)

单元测试不是一个简单的主题,您应该在其他地方找到一些教程或阅读本书,以了解如何正确地完成它。

解释单元测试的最简单方法是说它用于测试其他类中的类和方法,看它们是否正常工作。

如果要遵循约定创建测试时,您应将Example命名为您正在测试的类,并在末尾添加Test,因此类ExampleTest应该具有名为{{1的测试类}}。

现在在ExampleTest内,您可以通过测试方法测试行为,一种方法可以 应该有更多测试。在命名test methods时,有许多不同的方法,这里很少流行:

  • [tested behavior]_[tested input or state]_[expected result] - 我更喜欢这个项目
  • [behavior being tested] - 测试简单的事情时
  • test[behavior being tested] - 我不想放测试词,因为它有点明显

现在你测试的东西可能不同,它们从用例到用例都有所不同,但是应该检查的东西总是很少有标准情况应该总是通过(以确保方法首先工作)和边缘情况例如,在采用null0Integer.[MAX/MIN]_VALUE,空字符串/集合/数组,负数索引和其他&#34;关键&#34;时,方法的行为方式值。

例如,让我们看看getGate,如果您编写上面提到的几个测试用例,您将看到它失败,-1,3或Integer.MAX_VALUE都是方法可以采用的有效值,但它会对于其中任何一个都失败了,所以现在你可以选择改进其他方法来处理那些,添加几个如果检查值,如果它是有效的你可以返回Gate否则你应该抛出异常。

是的,也许您知道您只有3个门并且不会尝试使用更大的号码来呼叫它,但是如果您选择在6个月内更改该代码怎么办?那你会记得吗?

因此,请务必始终处理大多数&#34;失败案例&#34;这是显而易见的,当你面对新的时,也要确保修复它们。这就是为什么我们进行单元测试的主要原因,另一方面是为了确保单个代码单元正常工作,因为如果这些小代码没有做到应该怎样才能使整个程序正常工作?