Java 如何使用junit测试if语句?

Java 如何使用junit测试if语句?,java,junit,Java,Junit,我似乎找不到任何在线教程解决这个问题 我有一个if语句: if (basket.getCustomerId() != null) { Basket exBasket = findBasketByCustomerId(basket.getCustomerId()); if (exBasket != null && exBasket.getBasketId() != null) {

我似乎找不到任何在线教程解决这个问题

我有一个
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());
    }

单元测试的目的不是测试语句,而是测试方法。正确的做法是不考虑这条线,而是考虑它出现的方法,并询问你希望该方法做什么:它需要什么样的输入,以及它应该产生什么样的输出?< /P> 然后编写测试,获取一些典型的输入,并检查它们是否提供了正确的输出,以及一些边缘情况输入(如
null
、0、
Integer.MAX_VALUE
,等等),并检查您是否也获得了正确的输出

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

  • 带有
    null
    客户ID的
    basket
  • 一个
    null
    篮子(除非您确定这永远不会发生),因为当前此代码将给出
    NullPointerException
  • 具有客户ID的购物篮,应允许您查找已知的
    exBasket
  • 具有客户ID的篮子,该ID将返回
    null
    exBasket
  • 一个购物篮,其客户ID将返回一个不为null的
    exBasket
    ,但其购物篮ID为
    null

假设这是您试图测试的方法的摘录,听起来您至少需要两个测试用例-一个是
basket.getCustomerId()
预期为空,另一个不是空。在这两种情况下,您都应该能够根据预期结果测试方法的返回值(我假设在
getCustomerId()
为null的事件中也会返回
Basket
)。

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

模拟框架(比如)可以用来为测试设置前提条件

@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.
}

好的,这很有意义。但是你实际上是如何编写一个测试来测试if语句的。我真的不知道语法是什么样的。我想用某种方法来测试它是否为null,然后返回if语句的其余部分。不确定该怎么做。thanks@BlueShark我认为你看得不对。正如我说的,不要考虑测试st一点也不夸张。想想输入和输出。好吧,看看我的问题,你的第一个要点的最新答案。这是正确的吗?@BlueShark很可能,尽管你需要以某种方式定义
mockBasket
,我假设
.createBasket()
是包含您提到的语句的方法吗?这在我的类的顶部。@Mock private Basket mockBasket;对不起,哪条语句?.createBasket()是basketinformationserviceinpl类中的方法