2014-12-22 128 views
2

我似乎无法在网上找到的任何教程,解决这个如何测试junit语句?

我有这个if声明:

if (basket.getCustomerId() != null) { 
       Basket exBasket = findBasketByCustomerId(basket.getCustomerId()); 
       if (exBasket != null && exBasket.getBasketId() != null) { 
        return exBasket; 
       } 

,我想要写一个单元测试,将测试每根线,看它是否正在做正确的事情。

任何想法?

@Test 
    public void testBasketWithANullCustomerId(){ 
     basketInformationServiceImpl.createBasket(mockBasket); 
     assertNotNull(mockBasket.getCustomerId()); 
    } 

回答

8

单元测试的目的不是为了测试语句方法。正确的做法是不考虑这条线,而是考虑它出现的方法,并询问你想要该方法做什么:它需要什么类型的输入以及它应该产生什么类型的输出?

然后编写需要一些典型投入测试,并检查他们给正确的输出,也有一些边缘情况输入(如null,0,Integer.MAX_VALUE等),并检查是否得到正确的输出对于那些也是。

如果这是你的整个方法(实际上这是不可能的,但如果是它的本质),我想测试:

  • 一个basketnull客户ID;
  • a null购物篮(除非你确定这永远不会发生),因为目前这段代码会给出NullPointerException;
  • 有一个顾客编号的篮子,可以让你找到一个已知的exBasket;
  • 一个购物篮,其客户ID将返回exBasketnull;
  • 具有客户ID的购物篮将返回非空的exBasket,但其购物篮ID为null
+0

没关系。但你怎么写一个测试来测试语句。我无法弄清楚语法的样子。 我想要一些方法来测试它是否为空,然后返回if语句的其余部分。不知道如何去做。谢谢 – BlueShark

+0

@BlueShark我认为你看错了方式。正如我所说,不要考虑测试*声明*。考虑*输入和输出*。 –

+0

好的,看看我的问题,为您的第一个要点提供更新的答案。它是否正确? – BlueShark

0

假设这是一个你试图测试的方法的摘录,这听起来像你至少需要两个测试用例 - 其中basket.getCustomerId()预期为null,而另一个则不是。在这两种情况下,您都应该能够测试该方法的返回值(假设Basket将返回以及在getCustomerId()为空的情况下)与预期结果相比较。

0

要以您似乎想要的方式(强调行覆盖率)进行测试,您需要针对您要测试的每种情况进行测试(例如,针对空basketId的一个测试,针对非null basketId的另一个测试,另一种情况下你想测试)。

模拟框架(如Mockito)可用于设置测试的先决条件。举一个例子,你可以说

@Test 
public void myTestWithNonNullBasketId() { 
    Basket inputBasket = Mockito.mock(Basket.class); 
    when(inputBasket.getBasketId()).thenReturn(1); //Or whatever we want basketId to return, null if you want to check that case. 
    ... //More mocking as needed, presumably to dictate whatever findBasketByCustomerId might return. 

    //Call the method you are testing, use org.junit.Assert assertions to check outputs. 
}