Java 用于 try 和 catch 块覆盖的 JUnit

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/42508323/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 00:11:22  来源:igfitidea点击:

JUnit for both try and catch block coverage

javajunit

提问by John

I am trying to write a JUnit for below code but I am not getting any idea how to cover the code which is written in catch block statement. Please can any one write a sample JUnit for below code.

我正在尝试为下面的代码编写一个 JUnit,但我不知道如何覆盖用 catch 块语句编写的代码。请任何人为以下代码编写示例 JUnit。

Here I don't want to cover any exception, but want to cover the lines of code written in the catch block using Mockito.

在这里,我不想涵盖任何异常,而是想涵盖使用 Mockito 在 catch 块中编写的代码行。

public Product getProductLookUpData() {

        Product product = null;
        try{
            // Try to get value from cacheable method
            product = productCacheDao.getProductLookUpData();
            .....//statements
        } catch (Exception ex) {
            // getting value from db
            product = productDao.getIpacMetricCodeLookUpData();
            ....//statements
        }

        return product;
    }

采纳答案by esin88

You can mockboth productCacheDaoand productDaoand check how many times those methods were invoked in your test cases. And you can simulate exception throwing with those mock objects, like this:

你可以嘲笑productCacheDaoproductDao和检查这些方法进行了多少次在你的测试用例调用。您可以使用这些模拟对象模拟异常抛出,如下所示:

when(mockObject.method(any())).thenThrow(new IllegalStateException());

So, for your case I would do something like this:

所以,对于你的情况,我会做这样的事情:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import static org.mockito.Mockito.*;

public class ProductTest {
    private static final Product CACHED_PRODUCT = new Product("some parameters for cached product");
    private static final Product DB_PRODUCT = new Product("some parameters for DB product");

    private ProductService service;
    private ProductDao productDaoMock;
    private ProductCacheDao productCacheDaoMock;

    @Before
    public void setup() {
        service = new ProductService();
        productDaoMock = mock(ProdoctDao.class);
        service.setProductDao(productDaoMock);

        productCacheDaoMock = mock(ProdoctCacheDao.class);
        service.setProductCacheDao(productCacheDaoMock);
    }

    @Test
    public void testCache() {
        when(productCacheDaoMock.getProductLookUpData(any())).thenReturn(CACHED_PRODUCT);

        final Product product = service.getProductLookUpData();

        Assert.assertEquals(CACHED_PRODUCT, product);
        verify(productCacheDaoMock, times(1)).getProductLookUpData(any());
        verify(productDaoMock, never()).getIpacMetricCodeLookUpData(any());
    }

    @Test
    public void testDB() {
        when(productCacheDaoMock.getProductLookUpData(any())).thenThrow(new IllegalStateException());
        when(productDaoMock.getIpacMetricCodeLookUpData(any())).thenReturn(DB_PRODUCT);

        final Product product = service.getProductLookUpData();

        Assert.assertEquals(DB_PRODUCT, product);
        verify(productCacheDaoMock, times(1)).getProductLookUpData(any());
        verify(productDaoMock, times(1)).getIpacMetricCodeLookUpData(any());
    }
}

回答by thopaw

You can use Mocking frameworks like Mockito

您可以使用Mockito 之类的Mocking 框架

In your JUnit Test you can do something like

在您的 JUnit 测试中,您可以执行以下操作

public class YourTest {

  private ProductcacheDao productCacheDaoMock;

  @Before
  public void setup() throws Exception {

    productCacheDaoMock = Mockito.mock(ProductcacheDao.class);

  }

  @org.junit.Test
  public void test() {
      // Given
      Mockito.when(productCacheDaoMock.getProductLookUpData()).thenThrow(new RuntimeException());

      // When
      // do your stuff
      productCacheDaoMock.getProductLookUpData();

      // Then
      // ...
  }

}

回答by Adam

Mockito, or another mocking framework can be used. You will need two test cases - with and without the exception being thrown. You can mock your DAOs to return a known object so you verify your service is exhibiting the correct behaviour.

可以使用Mockito或其他模拟框架。您将需要两个测试用例 - 抛出异常和不抛出异常。您可以模拟 DAO 以返回已知对象,以便验证您的服务是否表现出正确的行为。

I've written a full example below.

我在下面写了一个完整的例子。

public class MocksExample {

    private ProductService service;
    @Mock
    private ProductDao productDao;
    @Mock
    private ProductCacheDao productCacheDao;
    @Mock
    private Product product;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        service = new ProductService();
        service.setProductCacheDao(productCacheDao);
        service.setProductDao(productDao);
    }

    @Test
    public void serviceReturnsProduct() {
        when(productCacheDao.getProductLookUpData()).thenReturn(product);
        assertThat(service.getProductLookUpData(), is(product));
    }

    @Test
    public void ipacProductReturnedWhenDaoThrowsException() {
        when(productDao.getIpacMetricCodeLookUpData()).thenReturn(product);
        when(productCacheDao.getProductLookUpData()).thenThrow(new IllegalStateException("foo"));
        assertThat(service.getProductLookUpData(), is(product));
    }
}